如何在gcc中禁用编译器优化?

时间:2011-04-23 17:58:45

标签: c gcc compiler-optimization compiler-options

我正在尝试学习汇编语言。我搜索并发现如何反汇编.c文件,但我认为它产生了一些优化版本的程序。有什么办法可以让我看到与我的C文件对应的精确汇编代码。

7 个答案:

答案 0 :(得分:89)

gcc选项-O支持不同级别的优化。使用-O0禁用它们并使用-S输出程序集。 -O3是最高级别的优化。

从gcc 4.8开始,优化级别-Og可用。它支持不干扰调试的优化,是标准编辑 - 编译 - 调试周期的推荐默认值。

要将程序集的方言更改为intel或att,请使用-masm=intel-masm=att

您还可以使用-fname手动启用某些优化。

了解更多gcc manual

答案 1 :(得分:8)

对于gcc,您要省略传递给编译器的任何 -O1 -O2 -O3 选项,或者如果您已经拥有它们,则可以附加 - O0 选项再次将其关闭。它还可以帮助您为调试添加 -g ,以便您可以在调试器中查看c源代码和反汇编代码。

另请参阅:http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

答案 2 :(得分:6)

使用开关-O0( - [capital o] [零])来禁用优化,使用-S来获取汇编文件。查看here以查看更多gcc命令行选项。

答案 3 :(得分:4)

要测试没有复制省略并且看到你复制/移动构造函数/操作符添加" -fno-elide-constructors"。

即使没有优化(-O0),GCC和Clang仍会执行复制省略,这在某些情况下会跳过复制/移动构造函数。有关复制省略的详细信息,请参阅this question

然而,在Clang 3.4中它确实触发了一个错误(一个无效的临时对象而没有调用构造函数),这在3.5中已经修复。

答案 4 :(得分:1)

如果使用gcc命令行传递-O0,则可以禁用优化。

E.g。将.C文件转换为.S文件调用:

gcc -O0 -S test.c

答案 5 :(得分:1)

很久以前,但仍然需要。

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled

答案 6 :(得分:0)

您还可以使用#pragma GCC push_options在内部控制优化

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options