【问题标题】:How to turn off all optimizations in GCC如何关闭 GCC 中的所有优化
【发布时间】:2026-02-07 12:20:05
【问题描述】:

如何关闭 GCC 中的所有优化?使用 -O0 不起作用,因为它仍然会优化没有效果的语句,或者在没有任何 break 语句的无限循环之后的任何代码。

【问题讨论】:

  • 没有,我只有-g -gstrict-dwarf -Wall
  • 我不认为你可以关闭所有优化。
  • 即使没有任何标志 gcc 也会做一些基本的优化。删除没有影响(优化与否)的语句是有意义的。只是好奇:为什么要保留死代码?
  • 这是用于测试框架的目的
  • 这里:gcc.gnu.org/onlinedocs/gnat_ugn_unw/Optimization-Levels.html 声明使用 gcc,如果执行时间有任何问题,将 -O0 用于生产是非常不寻常的,因为 -O0 确实意味着根本没有优化。在进行性能比较时,应该牢记 gcc 和其他编译器之间的这种差异。问题是您是否真的关心编译和调试优化。我相信您无法阅读它,也无法阅读编译本身。

标签: c gcc compiler-optimization


【解决方案1】:

没有办法让 gcc 不忽略无法访问的代码和无效的语句。

您可以做的是使用 volatile 变量使无法访问的代码看起来可以访问。

volatile bool always_true = true;

if( always_true  )
{
     //infinite loop
     //return something
}

//Useless code

在上面的例子中,gcc 不会优化掉无用的代码,因为它不知道它实际上是无用的

int a = 5;
int b = 5;
volatile int c = 9;

c += 37;
return a + b;

在这个例子中,整数 c 不会被优化出来,因为 gcc 不知道它是死重代码。

【讨论】:

    【解决方案2】:

    你必须让你的代码几乎不可能被编译器优化。 例如:

    • 对不希望优化的变量使用 volatile 关键字
    • 确保代码有效,例如:不仅更改变量值,还打印值或将其存储到另一个变量或对变量进行算术并将其存储在另一个变量中
    • 引用/更改其他函数中的变量,以确保编译器无法判断它在编译时没有使用

    【讨论】: