編程雜談——使用emplace_back取代push_back

  • 2019 年 10 月 16 日
  • 筆記

近日在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方法必須要使用,可以減少分配記憶體時間,提升性能

Tags: