jww*_*jww 12 c optimization gcc pragma
这与使用-O3时确定段错误的原因有关?在这个问题中,当-O3使用特定版本的GCC 编译时,我正在捕获特定函数中的段错误.在-O3,使用矢量化指令(at -O2,不使用它们).
我想在较低的优化级别中包装单个函数.根据GCC 4.2.2中特定功能的关闭优化,我可以做到.但是,按照问题和答案中的各种链接,我找不到"如何,确切地说,这样做"的答案.
如何将单个函数标记为使用不同的优化级别?
相关,我不想将此函数移动到单独的文件,然后为它提供不同的makefile配方.这样做可以打开另一种蠕虫病毒,比如仅在某些平台上将其应用于GCC 4.9.
nem*_*equ 14
我知道这个问题被标记为海湾合作委员会,但我只是考虑这样做,并认为结果可能会派上用场,所以:
optimize(X)函数属性optnone和minsize功能属性(使用__has_attribute测试支持).因为我相信 3.5它也有#pragma clang optimize on|off.#pragma intel optimization_level 0,适用于pragma之后的第一个函数#pragma optimize.请注意,13.1.6(至少)返回true #pragma option_override(funcname, "opt(level,X)")但实际上不支持它.__has_attribute(optnone),可以配合使用#pragma Onum#pragma push/pop#pragma opt X (funcname)#pragma _CRI [no]opt(C)和#pragma FUNCTION_OPTIONS(func,"…")(C++)#pragma FUNCTION_OPTIONS("…")因此,对于GCC/MSVC/clang/IAR和TI C++,您可以定义一个刚刚放在函数之前的宏.如果要支持XL,ODS和TI C,可以添加函数名作为参数.在函数弹出设置后,ARM将需要另一个宏.对于Cray AFAIK,您无法恢复之前的值,只能关闭和打开优化.
我认为这样做的主要原因是为错误的编译器(或者暴露代码中的错误的编译器)禁用优化,因此统一的可移植体验可能并不重要,但希望这个列表可以帮助有人为他们找到合适的解决方案.编译器.
它在https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes中有描述
您可以通过声明如下函数来更改级别:
void some_func() __attribute__ ((optimize(1))) {
    ....
}
强制优化级别1.
以下是使用编译指示的方法:
#pragma GCC push_options
#pragma GCC optimize ("-O2")
void xorbuf(byte *buf, const byte *mask, size_t count)
{
   ...
}
#pragma GCC pop_options
为了使其便携,类似于以下内容。
#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
它需要被包装,因为-Wall旧版本的 GCC 不理解-Wno-unknown-pragma,它们会导致编译时产生噪音。在现场会遇到旧版本,例如 OpenBSD 上的 GCC 4.2.1。
但根据 Markus Trippelsdorf 在“pragma优化”何时可用?来自 GCC 邮件列表:
这通常是一个坏主意,因为“pragma GCC optimize”仅作为编译器调试帮助。这应该不是在生产代码中使用。
| 归档时间: | 
 | 
| 查看次数: | 5996 次 | 
| 最近记录: |