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

Nea*_*eal 69 c gcc compiler-optimization compiler-options

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

pmr*_*pmr 97

gcc选项-O可实现不同级别的优化.使用-O0禁用它们,并使用-S输出组件.-O3是最高级别的优化.

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

要将组件的方言更改为英特尔或att使用-masm=intel-masm=att.

您也可以手动启用某些优化-fname.

看一看在GCC手册的更多.

  • 如果你没有指定任何-O标志,`-O0`是默认值(无优化). (32认同)
  • 使用-O0,您仍然可以进行优化:缩短编译时间并使调试产生预期结果. (11认同)
  • 如果你有一个合理的现代gcc支持-Og,试试看,我发现它通常提供比-O0更可读的程序集输出. (3认同)

Ian*_*ton 8

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

另见:http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html


MBy*_*ByD 6

使用开关-O0( - [capital o] [零])来禁用优化,使用-S来获取汇编文件.看看这里看到更多的gcc命令行选项.


小智 6

要进行无复制删除测试,并查看复制/移动构造函数/操作符,请添加“ -fno-elide-constructors”。

即使没有优化(-O0),GCC和Clang仍然会执行复制省略,这在某些情况下会跳过复制/移动构造函数。见这个问题有关复制省略的细节。

但是,在Clang 3.4中,它确实会触发错误(在没有调用构造函数的情况下为无效的临时对象),该错误已在3.5中修复。


mck*_*nzm 6

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

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

.... code here .....

#pragma GCC pop_options
Run Code Online (Sandbox Code Playgroud)