1. 程式人生 > >程式設計雜談——使用emplace_back取代push_back

程式設計雜談——使用emplace_back取代push_back

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