绕过c++中的复制语义

Getting around copy semantics in C++

本文关键字:复制 语义 c++ 绕过      更新时间:2023-10-16

请考虑以下代码:

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一样。