2016-03-30 5 views
-1

Scott Meyersの "Effective C++"項目26:可能な限り長い変数定義を延期すると、代入のコストは確実にコンストラクタとデストラクタのペアより小さくなりません。割り当てのコストがコンストラクタとデストラクタのペアよりも小さくなることが保証されないのはなぜですか?

異なるデータ型またはクラスの場合、代入のコストをコンストラクタとデストラクタのペアと比較するにはどうすればよいでしょうか。

私の意見では、コンストラクタとデストラクタのペアはメモリの割り当てと割り当てを解除する必要があり、コンストラクタは少なくとも変数を初期化します。しかし、代入は変数の値を変更するだけです。

したがって、私は一般に、割り当てのコストはコンストラクタとデストラクタのペアよりも小さくする必要があると思います。

+2

誰がコンストラクタは常にメモリを割り当てる必要がありますか? 'int'の値を変更することは、' int'を構築するよりもコストが安いことをどのように保証しますか? 'int'を保証することができない場合、' int'メンバを持つ単純な型の場合、それをどのように保証しますか? –

+1

関数内にオブジェクトを作成し、それを返してからA)既存の変数に代入するか、B)新しい変数を作成すると、戻り値の最適化のためにB)が速くなる可能性があります。 – dyp

+0

"*コンストラクタとデストラクタのペアはメモリを割り当てたり解放したりする必要があります。たとえば、[RAIIロックホルダー](http://en.cppreference.com/w/cpp/thread/lock_guard)に割り当てられているメモリが必要なのはなぜですか? –

答えて

8

あなたはアドバイスを誤解していると思います。 "デフォルトの建設+割当+破壊"よりも "建設+破壊"を行うほうが安いとの勧告があります。

いずれにしても、割り当てが安いことは保証されていません。これはクラス作成者の責任です。すべてのコンストラクタがメモリを割り当てているわけではなく、すべての割り当てが単に「変数の値を変更する」ではなく、一部の割り当てが再割り当てされたり、値の非自明なチェックが行われたりするわけではありません。また、一部の割り当ては、コピーおよびスワップイディオムのように、建設+破壊の面で実装されています:それは建設+スワップ+破壊を行うため

T& operator=(const T& t) { 
    T(t).swap(*this); 
    return *this; 
} 

この割り当ては、確かに建設よりも安いではありません。

+0

建設廃棄物よりも割当が安いのか、それとも逆であろうと教えてくれませんか?@Jonathan Wakely –

+1

私は既に割り当てが高価な例を示しました。それはより多くの仕事をしない場合は安いです。無数の可能な例があります。 –

関連する問題