2012-10-14 9 views
7

テスト環境:ユーザ作成のコンストラクタが生成されたアセンブリに影響するのはなぜですか?

// 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 

、コンパイラは、コード、および私の質問を最適化次のようになります。

ユーザ作成のコンストラクタを追加すると、生成されたアセンブリにそれほどの影響はありますか?

+0

VC++コンパイラは[Eliminate](http://en.wikipedia.org/wiki/Copy_elision)を一貫して実行しません。あなたはそれの例を見ているかもしれません。 –

+0

コンストラクタのキーワード 'explicit'があるので、後者はちょっと混乱しているので、* explicit *の代わりに* user-written *という言葉を使うように編集しました。(これはそうではありません) –

+8

デバッグを使用するときに生成されたアセンブリコードにあまりにも多くを読み取る。 Debugビルドを使用すると、コンパイラはステップバイステップのデバッグを確実に実行できます。これは、最適化が常に使用できるとは限らないことを意味します。生成されたアセンブリを見たい場合は、リリースビルドで行うのが最善です。 – MicroVirus

答えて

1

この質問は、C++でのコピーエリートと戻り値の最適化に関するものです。

生成されたアセンブリコードがコンパイラによって異なるため、時間をかけすぎることはお勧めしません。

コピーの省略は、標準で定義されている:

特定の基準が満たされ

、実装は、クラスオブジェクトのコピー/移動する構成を省略することができた場合であっても、コピー/移動コンストラクタおよび/またはオブジェクトのデストラクタには副作用があります。このような場合、実装は、省略されたコピー/移動操作のソースとターゲットを、同じオブジェクトを参照する2つの異なる方法として扱い、そのオブジェクトの破壊は、2つのオブジェクトが最適化せずに破壊されました。

[...]

§12.8[class.copy:コピーの省略と呼ばれるコピー/移動操作のこのエリジオンは、(複数のコピーを排除するために組み合わせることができる)は、以下の状況において許容されます]

すでにご存知のとおり、stackoverflow、see hereを参照してください。

関連する問題