c++ 为什么-O2的指令数比没有优化的编译多

k4ymrczo  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(104)

我在没有优化选项的https://godbolt.org/z/9xWvzcdbq和有优化选项的https://godbolt.org/z/9WTocce97中尝试了以下代码-O2
没有优化选项的版本生成43行汇编指令,指令bl std::atomic<int*>::load(std::memory_order) const,而具有-O2优化选项的版本生成49行汇编指令,数据存储器屏障dmb ish
这是预期的吗?为什么?部分原因是因为带有-O2优化选项的版本通过将指令bl std::atomic<int*>::load(std::memory_order) const分解为更多指令来优化它吗?

#include <atomic>
#include <iostream>
 
void print(int* val)
{
    std::cout << *val << std::endl;
}
 
int main()
{
    int x{42};
    std::atomic<int*> p = &x;
    int* local = p.load(std::memory_order_consume);
    print(local);
}

字符串

unguejic

unguejic1#

默认情况下,编译器资源管理器隐藏库函数定义。如果您取消选择“过滤器>库函数”,您会注意到非优化版本实际上生成了143行汇编,而优化版本只有52行汇编。由于函数内联,-O2中的库函数定义被优化了。

相关问题