【问题标题】:Why a user-written constructor affects the generated assembly?为什么用户编写的构造函数会影响生成的程序集?
【发布时间】: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


【解决方案1】:

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

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

标准中定义了复制省略:

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数有副作用。在这种情况下,实现将省略的复制/移动操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象本应被删除的较晚时间。没有优化就被破坏了。这种复制/移动操作的省略,称为复制省略,在以下情况下是允许的(可以组合起来消除多个副本):

[...]

§12.8 [class.copy]

已经有一个问题可以参考 stackoverflow,see here

【讨论】:

    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2013-05-16
    • 2017-07-20
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多