test environment: vs 2008, debug mode
test code:
// 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; }
and asm output:
; 39 : C c1 = getC(10); push 10 ; 0000000aH lea eax, DWORD PTR $T2595[ebp] push eax call ?getC@ @ YA?AVC@ @ H@Z ; 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
From the output of asm, we see that compilation creates 2 temporary objects.
However, when I define the constructor as follows:
C(int v=0): value(v) {};
and recompile the program, asm output will be:
; 39 : C c1 = getC(10); push 10 ; 0000000aH lea eax, DWORD PTR _c1$[ebp] push eax call ?getC@ @ YA?AVC@ @ H@Z ; getC add esp, 8
Obviously, the compiler optimizes the code, and my question is:
Why does adding a user-written constructor affect the generated assembly?
ajaxhe
source share