c++ - 在 emplace() 中创建对象时复制省略
问题描述
我看到很多代码在工作中,人们将 emplace 和 emplace_back 与临时对象一起使用,如下所示:
struct A {
A::A(int, int);
};
vector<A> v;
vector<A>.emplace_back(A(1, 2));
我知道 emplace_back 的重点是能够直接传递参数,如下所示:
v.emplace_back(1, 2);
但不幸的是,这对少数人来说并不清楚。但是,我们不要纠缠于此......
我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?
供您参考……我们正在使用 C++14。
解决方案
我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?
在一般情况下,它无法避免复制。由于emplace_back
通过转发引用来接受,它必须从纯粹的标准角度创建临时对象。毕竟,这些引用必须绑定到对象。
复制省略是一组规则,允许避免复制(或移动)构造函数,并省略复制,即使构造函数和相应的析构函数有副作用。它仅适用于特定情况。通过引用传递参数不是其中之一。因此,对于非平凡的类型,对象副本不能被 as-if 规则内联,如果编译器的目标是符合标准,那么它的双手就会受到约束。
推荐阅读
- html - 如何在百里香的文本框中设置预设值?
- c# - C# 实现特定类型函数的泛型类列表
- vue.js - 如何在vueJS中获取重定向链中的最后一个url
- javascript - 为什么在执行 GET XmlHttpRequest 时无法读取和提取此 HTTP 标头?
- themes - 有没有办法将 jupyter 样式添加到 google colab 中?
- php - Symfony 5:在扩展的加载方法中加载包时出错
- spring - 客户端断开连接后 Spring RSocket 高 CPU 使用率
- css - 如何将以下子元素左对齐到第一个子元素的右边缘?
- html - 跨度元素忽略 TranslateZ()
- php - 如果 php.ini 中的 memory_limit 设置为 -1 是什么意思?