【发布时间】:2012-10-04 13:49:39
【问题描述】:
测试环境:vs 2008,调试模式
测试代码是:
// 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 输出中,我们可以看到编译创建了 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
很明显,编译器优化了代码,我的问题是:
为什么添加用户编写的构造函数会对生成的程序集产生如此大的影响?
【问题讨论】:
-
VC++ 编译器不能始终如一地执行Copy Elision。您可能会看到这样的例子。
-
我已经编辑使用术语 user-written 而不是 explicit,因为后者有点混乱,因为有一个关键字 @987654326 @ 用于构造函数(这不是那个)
-
我一般建议在使用 Debug 时不要过多阅读生成的汇编代码。当使用 Debug 构建时,编译器确保它可以执行逐步调试;反过来,这意味着不能总是使用优化。如果您想查看生成的程序集,最好在 Release 构建中进行。
-
以前,类是 POD。后来就没有了。
标签: c++ compiler-construction compilation