C++移動コンストラクタ

2395 ワード

モバイルコンストラクション関数の動作原理を理解するには、コンパイル時にコンパイルオプション-fno-elide-constructorsを設定して戻り値最適化効果を閉じる必要があります.コンパイラ最適化を回避し、モバイルコンストラクション関数を呼び出すプロセスが見えない場所もあります.-fno-elide-constructorsこのパラメータはC++のみのもので、マニュアルのパラメータの説明は以下の通りです.
   -fno-elide-constructors
       The C++ standard allows an implementation to omit creating a
       temporary which is only used to initialize another object of the
       same type.  Specifying this option disables that optimization, and
       forces G++ to call the copy constructor in all cases.

C++標準では、同じタイプの別のオブジェクトを初期化するための一時オブジェクトの作成を省略することができます.このパラメータ(-fno-elide-constructors)がこの最適化をオフにし、G++がすべての場合にコピー構造関数を呼び出すように強制することを指定します.
(stackoverflowでこのパラメータの使用に関する問題がありますhttps://stackoverflow.com/questions/27086573/when-and-why-would-i-use-fno-elide-constructors)
次に、コードの分析を行います.

g++testを使用する.cpp -fno-elide-constructors -g -o .\.output\main.exeコマンドによるコンパイル
実行結果:
construct//これはA b時に非パラメトリックコンストラクタmove construct//これはb初期化関数が返すテンポラリオブジェクトを呼び出すときに呼び出される移動コンストラクタdelete//bオブジェクトmove construct//関数が返すテンポラリオブジェクトをa初期化するときに移動コンストラクタdelete//関数が返すテンポラリオブジェクトを呼び出す
モバイルコンストラクション関数のコメントを削除すると、コンパイル後に実行される結果は次のとおりです.
construct/これはA b時に非パラメトリックコンストラクタcopy construct//これはb初期化関数が返す一時オブジェクトであるときに呼び出されるコピーコンストラクタdelete//bオブジェクトcopy construct//関数が返す一時オブジェクトをa初期化するときにコピーコンストラクタを呼び出す(コピーコンストラクタがカスタマイズされているため、コンパイラはデフォルトの移動コンストラクタを合成しません)delete//関数が返す一時オブジェクトを解放します
モバイルコンストラクション関数とコピーコンストラクション関数をコメントすると、コンパイル後に実行される結果は次のとおりです.
construct//これは、A bが呼び出されたときに非パラメトリック関数delete//bオブジェクトdelete//関数を解放して返される一時オブジェクトです
3つ目のケースは、コンパイラが独自に合成したコピーコンストラクション関数を使用することに注意してください.コピーコンストラクタまたはコピー付与演算子は、独自に定義されていないためです.ここでは、コンストラクション関数をカスタマイズするため、コンパイラはデフォルトの移動コンストラクション関数を合成しません.具体的には「C++primer」13章を参照してください.