aja*_*xhe 7 c++ compiler-construction compilation
测试环境: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;
}
Run Code Online (Sandbox Code Playgroud)
而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
Run Code Online (Sandbox Code Playgroud)
从asm输出中,我们可以看到compile create 2临时对象.
但是,当我将构造函数定义如下时:
C(int v=0): value(v) {};
Run Code Online (Sandbox Code Playgroud)
并重新编译该程序,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
Run Code Online (Sandbox Code Playgroud)
显然,编译器优化代码,我的问题是:
为什么添加用户编写的构造函数会如此影响生成的程序集?
小智 1
这个问题是关于C++中的复制省略和返回值优化。
\n\n我建议您不要花太多时间在上面,因为生成的汇编代码取决于编译器。
\n\n标准中定义了复制省略:
\n\n\n\n\n当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数有副作用。在这种情况下,实现将省略的复制/移动操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本应被删除的时间的较晚时间。未经优化就被破坏。这种复制/移动操作的省略称为复制省略,在以下情况下是允许的(可以组合起来消除多个副本):
\n\n[...]
\n\n\xc2\xa712.8 [类.copy]
\n
stackoverflow 上已经有一个问题可以参考,参见这里。
\n| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |