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))) {
....
}
Run Code Online (Sandbox Code Playgroud)
强制优化级别1.
以下是使用编译指示的方法:
#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”仅作为编译器调试帮助。这应该不是在生产代码中使用。
归档时间: |
|
查看次数: |
5996 次 |
最近记录: |