如何更改一个功能的优化级别?

jww*_*jww 12 c optimization gcc pragma

这与使用-O3时确定段错误的原因有关?在这个问题中,当-O3使用特定版本的GCC 编译时,我正在捕获特定函数中的段错误.在-O3,使用矢量化指令(at -O2,不使用它们).

我想在较低的优化级别中包装单个函数.根据GCC 4.2.2中特定功能的关闭优化,我可以做到.但是,按照问题和答案中的各种链接,我找不到"如何,确切地说,这样做"的答案.

如何将单个函数标记为使用不同的优化级别?


相关,我不想将此函数移动到单独的文件,然后为它提供不同的makefile配方.这样做可以打开另一种蠕虫病毒,比如仅在某些平台上将其应用于GCC 4.9.

nem*_*equ 14

我知道这个问题被标记为海湾合作委员会,但我只是考虑这样做,并认为结果可能会派上用场,所以:

  • GCC有一个optimize(X)函数属性
  • 铛具有optnoneminsize功能属性(使用__has_attribute测试支持).因为我相信 3.5它也有#pragma clang optimize on|off.
  • MSVC具有#pragma intel optimization_level 0,适用于pragma之后的第一个函数
  • IBM XL#pragma optimize.请注意,13.1.6(至少)返回true #pragma option_override(funcname, "opt(level,X)")但实际上不支持它.
  • ARM有__has_attribute(optnone),可以配合使用#pragma Onum
  • ODS#pragma push/pop
  • 克雷#pragma opt X (funcname)
  • TI#pragma _CRI [no]opt(C)和#pragma FUNCTION_OPTIONS(func,"…")(C++)
  • IAR#pragma FUNCTION_OPTIONS("…")

因此,对于GCC/MSVC/clang/IAR和TI C++,您可以定义一个刚刚放在函数之前的宏.如果要支持XL,ODS和TI C,可以添加函数名作为参数.在函数弹出设置后,ARM将需要另一个宏.对于Cray AFAIK,您无法恢复之前的值,只能关闭和打开优化.

我认为这样做的主要原因是为错误的编译器(或者暴露代码中的错误的编译器)禁用优化,因此统一的可移植体验可能并不重要,但希望这个列表可以帮助有人为他们找到合适的解决方案.编译器.


vir*_*tor 9

它在https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes中有描述

您可以通过声明如下函数来更改级别:

void some_func() __attribute__ ((optimize(1))) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

强制优化级别1.

  • 不,它是特定于 GCC 的。Clang 有一个更严厉的 [optnone](http://clang.llvm.org/docs/AttributeReference.html#optnone-clang-optnone),它会扼杀所有优化。但两者都只是自定义扩展。函数级优化没有标准。 (2认同)

jww*_*jww 6

以下是使用编译指示的方法:

#pragma GCC push_options
#pragma GCC optimize ("-O2")
void xorbuf(byte *buf, const byte *mask, size_t count)
{
   ...
}
#pragma GCC pop_options
Run Code Online (Sandbox Code Playgroud)

为了使其便携,类似于以下内容。

#define GCC_OPTIMIZE_AWARE (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__)

#if GCC_OPTIMIZE_AWARE
# pragma GCC push_options
# pragma GCC optimize ("-O2")
#endif
Run Code Online (Sandbox Code Playgroud)

它需要被包装,因为-Wall旧版本的 GCC 不理解-Wno-unknown-pragma,它们会导致编译时产生噪音。在现场会遇到旧版本,例如 OpenBSD 上的 GCC 4.2.1。

但根据 Markus Trippelsdorf 在“pragma优化”何时可用?来自 GCC 邮件列表:

这通常是一个坏主意,因为“pragma GCC optimize”仅作为编译器调试帮助。这应该不是在生产代码中使用。