【问题标题】:Is gcc missing an opportunity to optimize ctor initializer lists?gcc 是否错过了优化 ctor 初始化程序列表的机会?
【发布时间】:2019-11-09 08:37:24
【问题描述】:

考虑这两个结构(合法的 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 编译。这是一个“优化错误”吗?

【问题讨论】:

  • 哪个 gcc 版本?如果您使用 {} 语法也会发生这种情况,即:“struct A { unsigned int a{5}; } a;” ?
  • 只有当行为明显不同于标准要求时,它才会是一个“错误”,而事实并非如此。编译器优化是实现的质量问题,而不是所有编译器都需要做同样的事情。在比较 clang 和 g++ 时,可以肯定的是,每个都比另一个更好地支持某些优化。
  • @Peter 我更新了我的问题......当然,我不是在谈论原始意义上的错误,更多的是在失去优化机会的意义上!谢谢指出
  • @MartinHierholzer 我已经更新了问题并添加了版本号。它在godbolt链接中也可见!感谢您指出!顺便说一句:有趣的是,g++ 在使用{} 语法时也有问题......这是一个已知问题吗?
  • 奇怪的是,如果您实际使用这些对象,看起来两个编译器都会为 BC 使用 zero-then-mov route

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2016-09-13
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多