程式設計雜談——使用emplace_back取代push_back
阿新 • • 發佈:2019-10-17
近日在YouTube視訊上看到關於vector中emplace_back與push_back區別的介紹,深感自己在現代C++中還是有不少遺漏的知識點,遂寫了段程式碼,嘗試比較兩者的差別。
示例程式碼
#include <iostream> #include <vector> #include <functional> #include <chrono> class Item { public: Item(std::string name, bool display = true):name(name), display(display) { if (display) std::cout << "Constructor: " << name << std::endl; } Item(const Item& item):name(item.name), display(item.display) { if (item.display) std::cout << "Copy Consturctor: " << item.name << std::endl; } private: std::string name; bool display; }; void calculate(std::vector<Item>& v, int count, std::function<void()> const& f) { clock_t begin_time = clock(); for (auto i = 0; i < count; i++) { f(); } std::cout << float(clock() - begin_time) / CLOCKS_PER_SEC << std::endl; } int main() { std::vector<Item> v; v.reserve(2); v.push_back(Item("push_back")); v.emplace_back("emplace_back", true); v.clear(); int count = 100000; v.reserve(count); calculate(v, count, [&]() { v.push_back(Item("push_back", false)); }); v.clear(); calculate(v, count, [&]() { v.emplace_back("emplace_back", false); }); }
執行結果
Constructor: push_back
Copy Consturctor: push_back
Constructor: emplace_back
0.431
0.28
結論
- emplace_back方法可以不呼叫拷貝建構函式,所以理論上它應該比push_back效能更好
- 經過10W次量級的資料計算,最終結果與預期一致
- reserve方法必須要使用,可以減少分配記憶體時間,提升效能