有没有一种方法可以告诉GCC不要优化特定的代码段?

26

我正在开发一个依赖于编译器优化的项目,但我需要确保某些代码不被GCC优化。这可行吗?


2
可能是如何防止gcc优化C语言中的某些语句?的重复问题。 - ulidtko
3个回答

34

1
太好了!这个方法很有效!我在想,如果我将属性添加到一个函数中,它是否也适用于所有子函数,还是仅适用于该函数本地执行的代码? - limp
1
@limp 只有在函数体内部(因为它可能调用从其他启用了优化的地方调用的函数...) - sehe
1
你真的需要在O3之前加连字符吗? - Adam Hunyadi
1
在ARM架构的GCC 9.1中,编译器报错并要求将属性放在声明之前。 - tothphu

21

自从4.4版本以来,GCC引入了#pragma GCC optimize ("whatever")。我建议在使用此指示符的代码周围加上#pragma GCC push_options#pragma GCC pop_options。前者会保存更改之前的选项,后者会在之后恢复这些选项,并使得剩余代码以全局选项编译。

关于whatever字符串的详细信息,请查阅GCC文档,以下是其中最重要的部分:参数可以是数字或字符串。数字被假设为优化级别。以O开头的字符串被假设为优化选项,而其他选项则被假设为需要使用-f前缀。.

这意味着,如果您不希望对特定代码进行任何优化,则应将whatever设置为"0"。


我尝试过,但是出现了“#pragma GCC optimize不允许在函数内部”的错误。是否可以在函数范围内启用/禁用优化? - limp
@limp:哦不,那行不通。这个编译指示几乎什么都没做,只是将相应的属性标志添加到函数中。因此,如果您真的想在函数的一小部分上更改选项,您至少需要将其移动到自己的子函数中。无法在内部函数中进行更改,因为许多优化作用于整个函数,并且从技术上讲,无法更改其中的某些部分的行为。 - flolo
好的,AFAIU 的意思是 #pragma GCC optimize 具有文件作用域。如果我在源文件的开头放置 #pragma GCC push_options #pragma GCC optimize ("O0"),然后在文件末尾放置 #pragma GCC pop_options,我猜想包含在此文件中的所有代码/函数都不会被优化,我是对的吗? - limp
@limb:是的,开头和结尾将处理整个文件。但您可以使其更细粒度。粒度是函数 - 也就是说,您可以在文件中优化不同的函数(必须在函数之间声明)- 您只是不能在函数内部执行它以单独处理一个函数。 - flolo
1
值得注意的是,Clang也可以使用#pragma GCC以保持兼容性。 - xdevs23

3

您可以将这段代码放入不同的文件中,并在没有优化的情况下进行编译。

或者尝试使用#pragma指令:

#pragma optimize level=0 

甚至更好的是使用以下内容进行启动和停止优化:
#pragma OPTIMIZE ON 
#pragma OPTIMIZE OFF

在GCC >= 4.4上,是否默认支持#pragma指令的编译器支持,还需要我执行其他操作来启用它? - limp
2
所有以下内容都受GCC支持吗?:#pragma GCC optimize 1 #pragma GCC optimize 0#pragma OPTIMIZE OFF #pragma OPTIMIZE ON#pragma optimize ("", off) #pragma optimize ("", on)此外,我可以在函数内使用这些编译指示吗? - limp
@limp:这取决于您的gcc版本。@fiolo指出它来自4.4。 - Heisenbug
在这个平台上似乎也是如此。在Raspbian(armv7l)上,尽管GCC版本为4.9.2,但不支持它们:(。__attribute__似乎可以工作。 - Jan Wielemaker

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