c++ - gcc 是否错过了优化 ctor 初始化列表的机会?

标签 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 understood , ab 应该产生完全相同的代码。

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 进行编译。这是“优化错误”吗?

最佳答案

答案只是"is",但值得一提的是允许优化的原因。允许执行 initialize anything statically如果它能证明某些副作用不会因此发生在错误的时间。该分析可能很复杂,这大概就是 GCC 不在此处费心的原因。

关于c++ - gcc 是否错过了优化 ctor 初始化列表的机会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56789066/

相关文章:

c++ - C和C++不完全数组指针转换规则的区别

c++ - 用于链接 OpenCV 和现有库的 Makefile(不使用 cmake)

c++ - 错误 : "EXC_BAD_ACCESS(code=EXC_I386_GPFLT)" when i try to insert class objects in array of class objects c++

c++ - 使用 C++ 读取 HTML 文本

c++ - 如何将常量传递给我的 DynamicArray 类添加方法

c++ - 如何确保 std::thread 是在多核中创建的?

c++ - 相对于 memset,我可以从 std::fill_n(ptr, n, 0) 获得什么性能?

c++ - g++ 在不使用 -Wconversion 的情况下将 double/float 转换为无符号整数时发出警告

c++ - 读取用于在图书馆计算机系统中搜索的一组关键字文档的文件

c++ - 应用程序崩溃,因为高输入