2016-09-30 23 views
-2

私は、たとえば、このコードがある場合:C++文字列連結のパフォーマンス

string x = "xyz" 

x=x+"qwe"; 

前の操作はどのように機能するのを、それは二重のxの大きさと、それをコピー、古い要素と、その後に新しい文字列を割り当てません新しい要素?

+5

[C++での効率的な文字列連結]の複製があります(http://stackoverflow.com/questions/611263/efficient-string-concatenation-in-c) –

+0

x.operator =(x.operator + ( "qwe")); '。 –

答えて

1

コンパイラの最適化がない場合は、yesです。 x + "qwe"は、xの代入の右辺だけでなく、どの場所でも使用できる式であるため、長さが6の新しいstd :: stringオブジェクトを作成します。2番目の手順では、xこの新しいstd :: stringオブジェクトの値が割り当てられ、新しい文字列オブジェクトは破棄されます。最適化が有効になっているスマートコンパイラは、最初は一時オブジェクトの作成を排除するほど賢明かもしれませんが、もちろん保証されているわけではありません。

あなたがこれを強制する場合は、代わりに書くことができます任意の一時的なオブジェクトの作成を防止

x += "qwe"; 

を。新しい文字サイズが容量を超えている場合でも、文字列オブジェクトはメモリを割り当てる必要があります。 x.capacity()を見ることでこれを調べることができます。また、リアルタイムを心配している場合は、x.reserve()を使ってメモリをあらかじめ予約することができます。