テスト環境:ユーザ作成のコンストラクタが生成されたアセンブリに影響するのはなぜですか?
// a demo for return value
class C
{
public:
int value;
int value2;
int value3;
//C(int v=0): value(v) {};
};
C getC(int v)
{
C c1;
return c1;
}
int main()
{
C c1 = getC(10);
return 0;
}
とASM出力は次のとおりです:VS 2008、デバッグモード
テストコードがあるのasm出力から
; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR $T2595[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
mov ecx, DWORD PTR [eax]
mov DWORD PTR $T2594[ebp], ecx
mov edx, DWORD PTR [eax+4]
mov DWORD PTR $T2594[ebp+4], edx
mov eax, DWORD PTR [eax+8]
mov DWORD PTR $T2594[ebp+8], eax
mov ecx, DWORD PTR $T2594[ebp]
mov DWORD PTR _c1$[ebp], ecx
mov edx, DWORD PTR $T2594[ebp+4]
mov DWORD PTR _c1$[ebp+4], edx
mov eax, DWORD PTR $T2594[ebp+8]
mov DWORD PTR _c1$[ebp+8], eax
、我々はコンパイルが2を作成して見ることができます一時的なオブジェクト。しかし
、私は次のようにコンストラクタを定義します。
C(int v=0): value(v) {};
と、プログラムを再コンパイルし、ASM出力がなっている:
明らか; 39 : C c1 = getC(10);
push 10 ; 0000000aH
lea eax, DWORD PTR _c1$[ebp]
push eax
call [email protected]@[email protected]@[email protected] ; getC
add esp, 8
、コンパイラは、コード、および私の質問を最適化次のようになります。
ユーザ作成のコンストラクタを追加すると、生成されたアセンブリにそれほどの影響はありますか?
VC++コンパイラは[Eliminate](http://en.wikipedia.org/wiki/Copy_elision)を一貫して実行しません。あなたはそれの例を見ているかもしれません。 –
コンストラクタのキーワード 'explicit'があるので、後者はちょっと混乱しているので、* explicit *の代わりに* user-written *という言葉を使うように編集しました。(これはそうではありません) –
デバッグを使用するときに生成されたアセンブリコードにあまりにも多くを読み取る。 Debugビルドを使用すると、コンパイラはステップバイステップのデバッグを確実に実行できます。これは、最適化が常に使用できるとは限らないことを意味します。生成されたアセンブリを見たい場合は、リリースビルドで行うのが最善です。 – MicroVirus