有没有办法告诉 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 不要优化一段特定的代码?的主要内容,如果未能解决你的问题,请参考以下文章

在gcc编译器中禁用特定优化(死代码消除)

不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]

有没有办法告诉 PowerPoint 在创建图表时不要打开 Excel?

gcc请不要优化

我可以告诉 Windows 不要换出特定进程的内存吗?

有没有办法告诉gcc忽略“”?