测试环境:vs 2008, Debug模式

测试代码是:

// 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输出为:
; 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

从asm输出中,我们可以看到compile create 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    ?getC@@YA?AVC@@H@Z          ; getC
add esp, 8

显然,编译器优化了代码,我的问题是:

为什么添加用户编写的构造函数会对生成的程序集产生如此大的影响?

最佳答案

这个问题与C++中的复制省略和返回值优化有关。

我建议您不要花太多时间,因为生成的汇编代码取决于编译器。

在标准中定义了复制省略:



您已经可以在stackoverflow上引用一个问题see here

关于c++ - 为什么用户编写的构造函数会影响生成的程序集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12881210/

10-11 18:56