emplace_backとpush_back性能比較

1903 ワード

push_back()関数がコンテナに一時オブジェクト(右要素)を追加すると、まずコンストラクション関数を呼び出してそのオブジェクトを生成します.次に、このオブジェクトをコピーコンストラクション関数でコンテナに挿入し、最後に一時オブジェクトを解放します.emplace_back()関数はコンテナに一時オブジェクトを追加し、一時オブジェクトはその場で構築され、値付けや移動の操作はありません.
#include 
#include 
#include 
#include 

struct data{
    int a;
    int b;
    int c;
    data(int a_ , int b_ , int c_): a(a_) , b(b_) , c(c_)    {

    }

    friend std::ostream & operator << (std::ostream &os, data &vt)//                 ,        
    {
        os< vec1 , vec2;
    auto start_time = std::chrono::steady_clock::now();
    for (int i = 0 ; i < 10000000 ; ++i)
    {
        vec1.push_back(data(i , i , i));
    }
    auto end_time = std::chrono::steady_clock::now();
    auto cost_time = std::chrono::duration_cast<:chrono::milliseconds>(end_time - start_time).count();
    std::cout << "push_back cost time: " << cost_time << std::endl;

    start_time = std::chrono::steady_clock::now();
    for (int i = 0 ; i < 10000000 ; ++i)
    {
        vec2.emplace_back(i , i , i);
    }
    end_time = std::chrono::steady_clock::now();
    cost_time = std::chrono::duration_cast<:chrono::milliseconds>(end_time - start_time).count();
    std::cout << "emplace_back cost time: " << cost_time << std::endl;

    std::cout << "vec1[100]: " << vec1[100] << std::endl;
    std::cout << "vec2[100]: " << vec2[100] << std::endl;
    return 1;
}


実行結果
push_back cost time: 204
push_back cost time: 133
vec1[100]: 100,100,100
vec2[100]: 100,100,100

単純に容器に単一の要素を加えるだけでは、両者の性能に大きな違いはありません.