绕过 C++ 中的复制语义

2024-04-22

请考虑这段代码:

class A
{

};

int main()
{
    std::vector<A> test;
    test.push_back(A());
}

构造函数和析构函数将被调用两次,内存将被分配两次并且对象将被复制,现在这不仅可能对性能不利,还可能导致运行时错误,特别是如果析构函数中正在进行一些清理。我通常解决这个问题的方法是创建一个指针向量:

std::vector<A*> test;
test.push_back(new A());

我的问题有两个,这是常见做法还是好的做法?或者,还有更好的方法? 如果事实证明这是一个骗局,请告诉我,我会关闭问题,但我在搜索中找不到任何内容。


Use emplace_back http://en.cppreference.com/w/cpp/container/vector/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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绕过 C++ 中的复制语义 的相关文章