在vector中的emplace_back函數, 其效率比push_back高很多!
/*例子中使用的Student類的聲明*/ class Student { private: int age; public: Student(); explicit Student(int age); ~Student(); int getAge(); };
原理分析
push_back函數
vector<Student> team; team.push(Student(24));
代碼運行過程中, 首先是執行Student()創建了一個臨時的Student對象, 然后再通過拷貝構造函數把這個臨時對象的成員變量值復制到team中的空間里.
二個原因造成效率慢:
- 創建臨時Student對象時,需要申請內存空間, 申請內存空間一向是耗時很嚴重的操作;
- 拷貝構造函數的復制操作也是需要CPU時間的;
emplace_back函數
vector<Student> team; team.emplace_back(24);
不說代碼的執行效率, 這段代碼實現的結果和上面是一樣的. 都在team里添加了一個24歲的Student對象; 但在執行效率上, emplace_back函數很快;
其原理就是emplace_back函數是直接在team中已有的空間上, 調用了Student類的構造函數, 節省了臨時對象的內存空間申請以及拷貝構造函數的復制操作.
emplace_back實現原理
void* ptr = malloc(sizeof(Student));
new (ptr)Student(100);
cout << ((Student*)ptr)->getAge() << endl;
第1行: 主要是分配一個Student對象所需的內存空間, 但在vector里, 這步不需要考慮, 內部會在實現;
第2行: 這才是重點, 通過這樣的語法, 就可以對已在的內存空間, 調用相應的Student類構造函數進行初始化;
第3行: 輸出驗證結果.
