#pragma GCC optimize()
和#pragma GCC target()
之间有什么区别,何时选择,还有什么其他选项?
在高层,optimize()
用于控制编译代码时是否使用某些优化技术:总体思路是编译器可以花费更多时间来生成执行速度更快的代码,或者偶尔生成运行所需内存更少的更紧凑的代码。优化后的代码有时更难分析或调试,因此您可能希望大部分程序未优化或优化程度较低,但一些对性能至关重要的特定功能需要高度优化。pragma为您提供了在逐个函数的基础上进行各种优化的自由。
在中列出并解释了个别优化https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-选项
优化属性表示法和目的的概述如下:
optimize (level, …)
optimize (string, …)
optimize属性用于指定要使用与命令行上指定的优化选项不同的优化选项编译函数。有效的参数是常量非负整数和字符串。每个数字参数指定一个优化级别。每个字符串参数由一个或多个逗号分隔的子字符串组成。每个以字母O开头的子字符串都指向一个优化选项,例如
-O0
或-Os
。其他子字符串作为-f前缀的后缀,共同形成优化选项的名称。请参见优化选项。
‘#pragma GCC optimize’
可用于设置多个函数的优化选项。有关pragma的详细信息,请参阅Function Specific Option Pragmas。提供多个字符串作为用逗号分隔的参数来指定多个选项,相当于在单个字符串中用逗号(","(分隔选项后缀。字符串中不允许有空格。
并不是每个以属性指定的
-f
前缀开头的优化选项都一定会对函数产生影响。optimize属性应仅用于调试目的。它不适用于生产代码。
target()
表示编译器可以使用特定CPU的机器代码指令。通常,如果你知道运行你的代码的人可能使用不同代的特定CPU,并且每一代都向后兼容,那么你应该为这些代中最早的一代进行编译,这样每个人都可以运行你的程序。使用target()
,您可以利用后几代CPU的更高级功能(机器代码指令,或仅针对特定缓存大小或流水线功能进行优化(编译不同的函数,然后您的代码可以在支持它的CPU上选择性地调用更快的版本。
目标(字符串,…(
多个目标后端实现target属性,以指定要使用与命令行上指定的目标选项不同的目标选项编译函数。可以提供一个或多个字符串作为参数。每个字符串由-m前缀的一个或多个逗号分隔后缀组成,共同构成一个依赖于机器的选项的名称。请参阅机器相关选项。
例如,目标属性可以用来让函数使用与默认ISA不同的ISA(指令集体系结构(进行编译。"#"pragma GCC target"可用于为多个函数指定特定于目标的选项。有关pragma的详细信息,请参阅Function Specific Option Pragmas。
例如,在x86上,您可以声明一个具有target("sse4.1,arch=core2"(属性的函数,另一个具有target("sse4a,arch=amdfam10"(属性。这相当于编译具有-msse4.1和-march=core2选项的第一个函数,以及具有-mss4a和-march=amdfam10选项的第二个函数。这取决于您是否确保仅在支持编译函数的特定ISA的机器上调用函数(例如,通过在x86上使用cpuid来确定使用了哪些功能位和体系结构系列(。
int core2_func (void) __attribute__ ((__target__ ("arch=core2")));
int sse3_func (void) __attribute__ ((__target__ ("sse3")));
提供多个字符串作为用逗号分隔的参数来指定多个选项,相当于在单个字符串中用逗号(","(分隔选项后缀。字符串中不允许有空格。
支持的选项是针对每个目标的;有关详细信息,请参阅x86函数属性、PowerPC函数属性、ARM函数属性、AArch64函数属性、Nios II函数属性和S/390函数属性。