2017-08-26 8 views
0

私は移動セマンティクスを学びたいと思っています。私は移動がコピーより速い可能性が高いと読んでいます。しかし、私は、次のささいなコードのための全く逆を参照してください。std :: stringのコピーコンストラクタが移動相手より速いように見えるのはなぜですか?

for (int i = 0; i < 100000000; ++i) { 
    std::string a("Copy"); 
    std::string b = a; 
} 

for (int i = 0; i < 100000000; ++i) { 
    std::string a("Move"); 
    std::string b = std::move(a); 
} 

そして、ここではそれが私のMac上でかかる時間です:コメントの一つとして

$ time ./copy.out 
real 0m2.511s 
user 0m2.481s 
sys  0m0.011s 


$ time ./move.out 
real 0m3.993s 
user 0m3.933s 
sys  0m0.020s 
+7

ことは、ベンチマークのコード全体ですか?コンパイラフラグ? –

+0

あなたの弦が短すぎて実際の違いを実証できないと思います。異なる長さの文字列で試してください。 –

+1

@VittorioRomeo、私はclangをC++ 14で使用していて、最適化を無効にしています(O0)。 – Zaxter

答えて

0

ほとんどのライブラリの実装では、「操作を行い、示唆します短い文字列最適化 "、SSOであり、十分に短い文字列(ある特定の長さ、所定の実装に対して)の場合、文字列全体が文字列オブジェクトの本体のスタックに格納される。データがスタック全体に保存されている場合、移動はコピーと同じです。私が知っているすべての実装は、SSOに4文字の文字列を割り当てます。したがって、移動するかコピーするかは、同じ操作です。

sizeof(sring)のあなたが出力結果ならば、それよりも大きな文字列を選択し、両方のケースで同じ文字列を使用します。また、最適化がオンになっていることを確認してください。

マイクロベンチマークへのこのアプローチはそれほど大きくありません。一般的には、タイミング領域の外側でデータをランダム化し、タイミングのとれたループで操作を実行する方が良いです。同じ定数データを使用すると、結果が無効になることがあります。

関連する問題