[STL] vector中函數emplace_back的實現原理


在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中的空間里.

二個原因造成效率慢:

  1. 創建臨時Student對象時,需要申請內存空間, 申請內存空間一向是耗時很嚴重的操作;
  2. 拷貝構造函數的復制操作也是需要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行: 輸出驗證結果.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM