如何在GCC中关闭所有优化

10
如何在GCC中关闭所有优化?使用-O0并不能达到目的,因为它仍会优化掉没有效果或任何代码之后没有break语句的无限循环的语句。

没有,我只有-g -gstrict-dwarf -Wall。 - user2124324
我认为你无法关闭所有优化。 - user529758
即使没有任何标志,gcc也会进行一些基本的优化。删除没有效果的语句(无论是否进行优化)是有意义的。只是好奇:为什么要保留死代码? - P.P
这是为测试框架目的而设计的。 - user2124324
在这里:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Optimization-Levels.html中指出,如果执行时间有任何关注点,则使用-O0进行生产非常不寻常,因为-O0确实意味着根本没有优化。在进行性能比较时,应牢记gcc和其他编译器之间的差异。问题是您是否真正关心编译和调试优化。我认为您无法从中读取,就像您无法从编译本身中读取一样。 - klm123
2个回答

9

无法使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不知道它是无用的代码。

使用 gcc -O0,只要不使用 const,就不需要使用 volatile。所有非 const 变量都被认为在 C 语句之间可能会改变值,这就是 为什么编译器在 -O0 "调试构建" 中不会跨语句保留寄存器中的值(与 volatile 很相似)。因此,if (variable) 永远不会是死代码,但 if (0)if (const)-O0 下则是死代码。 - Peter Cordes
但是,如果您想启用优化而不是为此分支禁用整个程序,那么请使用“volatile”! - Peter Cordes

3

您需要使代码几乎不可能被编译器优化。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接