在下面的代碼中,我期望從不調用A
的複製構造函數,因爲項目應該直接在emplace_back
的向量上創建,然後總結果應該是返回值優化。將一個項目追加到一個向量複製所有以前的項目
這似乎是這樣。但是,每次追加到矢量時,由於調用emplace_back
,所有以前的項目都將被複制。這是爲什麼發生?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
static int _id = 0;
class A{
public:
A(): name(_id++){
cout << "Created" << this->name << endl;
}
A(const A& other): name(other.name){
cout << "Copied" << this->name << endl;
}
A(const A&& other): name(other.name){
cout << "Moved" << this->name << endl;
}
~A(){
cout << "Deleted"<< this->name <<endl;
}
private:
int name;
};
vector<A> f2(){
cout << "Entering f2" << endl;
auto ret = vector<A>();
for (int i = 0; i < 3; i++){
//auto obj = A();
cout << "Adding obj" << endl;
ret.emplace_back();
cout << "Added obj" << endl;
}
cout << "Returning" << endl;
return ret;
}
int main()
{
{
auto c = f2();
cout << "Exiting stack" << endl;
}
return 0;
}
我用gcc 4.8.4編譯它使用任何的:
gcc main.cpp -std=c++11
gcc main.cpp -std=c++11 -O3
輸出是:
Entering f2
Adding obj
Created0
Added obj
Adding obj
Created1
Copied0
Deleted0
Added obj
Adding obj
Created2
Copied0
Copied1
Deleted0
Deleted1
Added obj
Returning
Exiting stack
Deleted0
Deleted1
Deleted2
而且我預計不會有副本,喜歡的東西:
Entering f2
Adding obj
Created0
Added obj
Adding obj
Created1
Added obj
Adding obj
Created2
Added obj
Returning
Exiting stack
Deleted0
Deleted1
Deleted2
改變emplace_back
與push_back
不能解決這個問題,並增加了額外的舉措。
的可能的複製[當矢量長如何執行移動語義?](http://stackoverflow.com/questions/8001823/how-to-enforce-move-semantics-when- a-vector-grow) – LogicStuff