有没有办法告诉 GCC 不要优化一段特定的代码?
Posted
技术标签:
【中文标题】有没有办法告诉 GCC 不要优化一段特定的代码?【英文标题】:Is there a way to tell GCC not to optimise a particular piece of code? 【发布时间】:2011-04-07 11:13:48 【问题描述】:我正在开发一个依赖编译器优化的项目,但我需要一些不被 GCC 优化的代码。这可能吗?
【问题讨论】:
How to prevent gcc optimizing some statements in C?的可能重复 【参考方案1】:GCC 4.4 有一个属性:
int foo(int i) __attribute__((optimize("-O3")));
记录在:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Function-Attributes.html#index-g_t_0040code_007boptimize_007d-function-attribute-3195
【讨论】:
太棒了!效果很好!我想知道是否将属性添加到函数中,它是否也适用于其所有子函数或仅适用于函数的本地执行代码? @limp 仅在函数体中(否则,因为它可以调用从 确实 启用了优化的 other 位置调用的函数。 ..) O3 之前真的需要连字符吗? 在 GCC 9.1 for ARM 中,编译器抱怨并要求属性位于声明之前。【参考方案2】:GCC 从 4.4 开始。 #pragma GCC optimize ("whatever")
。我还建议使用#pragma GCC push_options
和#pragma GCC pop_options
用此编译指示包装特定代码。第一个会将选项保存为更改之前的状态,后者将在之后恢复它们,其余代码将使用 global 选项进行编译。
有关 whatever 字符串的详细信息,您应该查看 gcc 文档,这里是其中最重要的部分:Arguments can either be numbers or strings. Numbers are assumed to be an optimization level. Strings that begin with O are assumed to be an optimization option, while other options are assumed to be used with a -f prefix.
。
这意味着如果您不想对特定代码进行任何优化,您的 whatever 应该只是“0”。
【讨论】:
我已经试过了,但我得到了一个“#pragma GCC optimize is not allowed inside functions”错误。是否可以在函数范围内启用/禁用优化? @limp:哦,不,那行不通。这个 pragma 实际上只在函数中添加相应的属性标志。因此,如果您真的想更改功能的一小部分的选项,您至少必须将其移动到自己的子函数中。不可能制作内部函数,因为许多优化适用于整个函数,而且从技术上讲,不可能只改变其中某些部分的行为。 好的,所以 AFAIU 这意味着#pragma GCC optimize 有一个文件范围。如果我在源文件的开头添加#pragma GCC push_options #pragma GCC optimize ("O0"),然后在文件末尾添加#pragma GCC pop_options,我猜这个文件中包含的所有代码/函数,不会被优化,对吗? @limb:是的,开头和结尾将处理整个文件。但是你可以让它更细粒度。粒度是函数——也就是说,你可以在不同的文件中优化函数(你必须在函数之间声明)——你不能在函数内部执行它来处理不同的单个函数。 值得注意的是,出于兼容性原因,Clang 也可以与#pragma GCC
一起使用。【参考方案3】:
您可以将那段代码放入不同的文件中,并在不进行优化的情况下对其进行编译。
或者尝试使用#pragma 指令:
#pragma optimize level=0
甚至更好地开始和停止优化:
#pragma OPTIMIZE ON
#pragma OPTIMIZE OFF
【讨论】:
我应该做些什么来启用编译器对#pragma 指令的支持,或者它默认出现在 GGC >= 4.4 上吗? GCC 是否支持以下所有内容?: #pragma GCC optimize 1 #pragma GCC optimize 0 #pragma OPTIMIZE OFF #pragma OPTIMIZE ON #pragma optimize ("", off) #pragma optimize (" ", on) 另外,我可以在函数内部使用这些编译指示吗? @limp:取决于您的 gcc 版本。 @fiolo 指出这是从 4.4 开始的。 似乎也在平台上。在 Raspbian (armv7l) 上,尽管 GCC 是 4.9.2 版,但这些不受支持:(。__attribute__
似乎可以工作。以上是关于有没有办法告诉 GCC 不要优化一段特定的代码?的主要内容,如果未能解决你的问题,请参考以下文章