Getting around copy semantics in C++

为君一笑 提交于 2020-01-01 08:00:06

问题


Please consider this code:

class A
{

};

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

The constructor and destructor will be called twice, also memory will be allocated twice and the object will copied, now not only is that potentially bad for performance it could also lead to run time errors, especially if there's some cleanup going on in the destructor. The way i'd usually get around this is to just create a vector of pointers instead :

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

My question is two fold, is this common practice and is it good practice? Or is there a better way? If this turns out to be a dupe please let me know and i'll close the question, but I couldn't find anything on searching.


回答1:


Use emplace_back.

std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);

This way, A will be constructed in-place, so no copy or move will occur.

Edit: To clarify on the comments on the question - No, this will not change from push_back if you pass it a temporary. For instance,

test.emplace_back(A{});

Will, in C++11, cause a temporary A to be constructed, moved and destroyed, as if you used push_back.



来源:https://stackoverflow.com/questions/40323722/getting-around-copy-semantics-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!