gcc是否缺少优化ctor初始化程序列表的机会?

时间:2019-06-27 10:29:10

标签: c++ c++11 g++ compiler-optimization clang++

考虑以下两个结构(合法的C ++ 11及更高版本):

struct A {
    unsigned int a = 5;
} a;

struct B {
    unsigned int b;
    B() : b(5) {}
} b;

As far as I understoodab应该产生完全相同的代码。

clang(8.0.0)符合我的期望,并生成以下程序集:

a:
        .long   5                       # 0x5
b:
        .long   5                       # 0x5

g ++(9.1)似乎错过了这种优化机会:

_GLOBAL__sub_I_a:
        mov     DWORD PTR b[rip], 5
        ret
b:
        .zero   4
a:
        .long   5

See the code on godbolt。 g ++编译到的内容与此等效:

struct C {
    unsigned int c;
    C() { c = 5; } // initialize + assign
} c;

这是我不希望的,尤其是因为我使用-O3进行编译。这是“优化错误”吗?

1 个答案:

答案 0 :(得分:1)

答案只是“是”,但这是允许的优化的原因值得一提。如果该实施可以证明在错误的时间不会发生某些副作用,则允许实施initialize anything statically。这种分析可能很复杂,这可能就是为什么GCC在这里不打扰的原因。