(轉載)emplace_back()和push_back()的區別
阿新 • • 發佈:2020-12-02
C++ STL vector新增元素(push_back()和emplace_back())詳解 (biancheng.net)
總結:由此可以看出,push_back() 在底層實現時,會優先選擇呼叫移動建構函式,如果沒有才會呼叫拷貝建構函式。
顯然完成同樣的操作,push_back() 的底層實現過程比 emplace_back() 更繁瑣,換句話說,emplace_back() 的執行效率比 push_back() 高。因此,在實際使用時,建議大家優先選用 emplace_back()。
emplace_back() 和 push_back() 的區別,就在於底層實現的機制不同。push_back() 向容器尾部新增元素時,首先會建立這個元素,然後再將這個元素拷貝或者移動到容器中(如果是拷貝的話,事後會自行銷燬先前建立的這個元素);而 emplace_back() 在實現時,則是直接在容器尾部建立這個元素,省去了拷貝或移動元素的過程。
為了讓大家清楚的瞭解它們之間的區別,我們建立一個包含類物件的 vector 容器,如下所示:
#include <vector> #include <iostream> using namespace std; class testDemo { public: testDemo(int num):num(num){ std::cout << "呼叫建構函式" << endl; } testDemo(const testDemo& other) :num(other.num) { std::cout << "呼叫拷貝建構函式" << endl; } testDemo(testDemo&& other) :num(other.num) { std::cout << "呼叫移動建構函式" << endl; } private: int num; }; int main() { cout << "emplace_back:" << endl; std::vector<testDemo> demo1; demo1.emplace_back(2); cout << "push_back:" << endl; std::vector<testDemo> demo2; demo2.push_back(2); }
執行結果為:
emplace_back:
呼叫建構函式
push_back:
呼叫建構函式
呼叫移動建構函式
在此基礎上,讀者可嘗試將 testDemo 類中的移動建構函式註釋掉,再執行程式會發現,執行結果變為:
emplace_back:
呼叫建構函式
push_back:
呼叫建構函式
呼叫拷貝建構函式
由此可以看出,push_back() 在底層實現時,會優先選擇呼叫移動建構函式,如果沒有才會呼叫拷貝建構函式。
顯然完成同樣的操作,push_back() 的底層實現過程比 emplace_back() 更繁瑣,換句話說,emplace_back() 的執行效率比 push_back() 高。因此,在實際使用時,建議大家優先選用 emplace_back()。