绕过c++中的复制语义
Getting around copy semantics in C++
请考虑以下代码:
class A
{
};
int main()
{
std::vector<A> test;
test.push_back(A());
}
构造函数和析构函数将被调用两次,内存将被分配两次,对象将被复制,这不仅对性能有潜在的不利影响,还可能导致运行时错误,特别是在析构函数中进行一些清理时。我通常绕过这个问题的方法是创建一个指针向量:
std::vector<A*> test;
test.push_back(new A());
我的问题是双重的,这是常见的做法,这是良好的做法吗?还是有更好的办法?如果这是一个骗局,请让我知道,我会关闭这个问题,但我找不到任何搜索
使用emplace_back
std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);
这样,A
将在原地构建,因此不会发生复制或移动。
编辑:为了澄清对问题的评论-不,如果你把它作为临时的,这将不会从push_back
改变。例如,
test.emplace_back(A{});
将在c++ 11中导致临时a被构造、移动和销毁,就像您使用push_back
一样。
相关文章:
- 使用移动和复制语义时函数匹配如何工作?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 复制省略并在返回值中移动语义
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 在'string=string+s1'和"string+=s1"之间移动语义可以保存多少个复制操作?
- C++复制构造函数和移动语义之间的区别
- 默认情况下,返回是否使用移动或复制语义
- 我应该依赖复制省略还是移动语义
- 在封装指针的类中,移动语义无意中被复制构造函数取代
- 为什么 boost::make_shared 使用复制语义
- 复制有状态分配器:标准库分配器语义和内部内存
- 每次复制实现移动分配的非 const 对象时,我是否总是获得移动语义
- 复制语义和比较
- 提升变体复制语义
- 有没有办法使用 move 而不是复制语义将函数返回值(对象)包装在 Python 中
- 消除默认/删除移动/复制语义中涉及的样板的好方法是什么
- 绕过c++中的复制语义
- std::数组复制语义