GCC CFLAGS 参数说明

来源:互联网 发布:蔡家坡广电网络 编辑:程序博客网 时间:2024/04/29 23:25
 

参数与用法 [注二] 
-O 
-O0, -O(-O1),-O2, -O3, -Os 
依照后面数字的大小,针对效能最佳化的程度也不同 (稳定度也可能递减)。其中 -Os 是个比较特殊的等级,针对原始码大小最佳化。 可使用 -Os,降低程序加载的时间。

-fforce-mem, -fno-force-mem 
-fforce-addr, -fno-force-addr 
强制在运算前将内存中的数值 (mem) 或内存位置 (addr) 复制到缓存器中。启动这两个选项可以做出较好的程序代码。 
这两个是好东西,启动它们!其中 -fforce-mem 已在 -O2, -O3, -Os 中启动,所以若您有用这三个选项的其中一个,只要 -fforce-addr 就够了。

-fomit-frame-pointer 
-fomit-frame-pointer, -fno-omit-frame-pointer 
若非必要,不将函式的 frame pointer 放进缓存器中。这将避免您的程序储存、设定、以及还原 frame pointer;也在许多函式中省下一个缓存器。这个选项可能让某些平台上的除错工作变成不可能!。若平台支持不使用 frame pointer 除错,这个选项将在 -O, -O2, -O3, -Os 中启动。

-finline-functions, -fno-inline-functions 
将所有简单的函式整合进呼叫他们的函式中。编译器会自动试探并决定那些函式值得被整合。于 -O3 时启动。 虽然这个选项会增加程序大小,但是他却是个增进效能的好东西。我建议您在这里启动它,然后使用下面一个指令指定 inline 条件。

-finline-limit=n 
n 为决定函式是否能被 inline 的伪指令长度。预设的值为 600。 
这个数值越小,程序启动的速度越快,但是运算的速度越慢。作为桌面使用,我建议 -finline-limit=400。

-fmove-all-movables, -fno-move-all-moveables 
-freduce-all-givs, -fno-redduse-all-givs 
这两个是循环最佳化技术,将无关循环内容的运算改在循环外执行。编译出的执行档可能更快也可能更慢,结果跟程序的写法有很大的关系。 
虽然说效能跟程序写法有关,但是大部份的状况下这两个选项会做出比较小与比较快的程序代码,所以我建议您启动他们! 

-freorder-blocks, -fno-reorder-blocks 
-freorder-functions, -fno-reorder-functions 
藉由重新编排程序区块来增进效能以及减少执行档大小。 
这两个也是好东西,所以我建议您启动它们。缺点是会让编译时间变长。


-fexpensive-optimizations, -fno-expensive-optimizations 
执行几个会加长编译时间的非主要最佳化程序。于 -O2, -O3, -Os 中预设开启。 
虽然会增加编译时间,但是能增加效能也能减少执行档大小,所以建议启用。

-falign-functions, -falign-functions=n 
-falign-labels,      -falign-labels=n 
-falign-loops,      -falign-loops=n 
-falign-jumps,     -falign-jumps=n 
依照大于 n 的最小 2 的次方字节对齐函式 (functions)、标签 (labels)、循环 (loops)、跳跃 (jumps) 的起头,跳过至多 n 字节。 
我知道这很抽象,解释起来要花很多篇幅,所以请各位使用默认值,亦即指定 -falign-functions, -falign-labels, -falign-loops, -falign-jumps,但是不指定 =n

-frename-registers, -fno-rename-registers 
在作过缓存器定位之后,使用剩下来的缓存器。这个最佳化在有很多缓存器的 CPU 上最明显 (如 ARM、PowerPC... 等。x86 不属于他们的一份子)。会增加除错的困难度。

-fweb, -fno-web 
建立经常使用的缓存器网络。提供更佳的缓存器使用率。不过也会增加除错的困难度。 
这个是安全选项中比较偏向实验性质的选项,虽然建议您启动,但是若启动之后程序不稳,请将它关闭。 于 -O3 时启动。

平台相关选项
-march=cpu-type 
-mtune=cpu-type 
依照不同的目标处理器进行最佳化。注意,若您指定了 -march,制作出的执行档将无法在其它 CPU 上使用。但是若光指定 -mtune,gcc 会避免使用平台专有指令集跟专用排程选项。可用的选项有:...

建议的 CFLAGS 

根据不同的用途,每个系统的 CFLAGS 也不尽相同。以下列出建议的 CFLAGS。其中请将 <cpu-type> 换成您的 CPU,以及根据系统支持程度启动 [] 里面的选项: 

* 最安全、什么都没有的 CFLAGS。在您回报执行阶段的错误 (sig 11、当机、运算错误) 之前,请先使用此 CFLAGS 编译一次,若还是发生同样的错误,才向 Gentoo Bugzilla (http://bugs.gentoo.org/) 回报: 
-march=i686 -mtune=i686 -O2 -pipe 


* 稍微比较快的 CFLAGS (建议那些以稳定为诉求的使用者使用): 
-march=<cpu-type> -mtune=<cpu-type> -O2 -pipe -fomit-frame-pointer 


* 注重执行时期效能使用的 CFLAGS (建议需要快速运算的软件使用): 
-march=<cpu-type> -mtune=<cpu-type> -mfpmath=sse,387 [-mmmx -msse -msse2 -msse3 -m3dnow] -minline-all-stringops -pipe -O3 -fomit-frame-pointer -fforce-addr -finline-functions -finline-limit=800 -fmove-all-movables -freduce-all-givs -freorder-blocks -freorder-functions -fexpensive-optimizations -falign-functions -falign-labels -falign-loops -falign-jumps -frename-registers -fweb -funit-at-a-time -funroll-loops -fprefetch-loop-arrays -ffunction-sections -fdata-sections -fbranch-target-load-optimize -fbranch-target-load-optimize2 


* 注重档案大小与加载速度的 CFLAGS (建议需要常常被启动的程序使用): 
-march=<cpu-type> -mtune=<cpu-type> -mfpmath=sse,387 [-mmmx -msse -msse2 -msse3 -m3dnow] -maccumulate-outgoing-args -malign-stringops -pipe -Os -fomit-frame-pointer -fforce-addr -finline-functions -finline-limit=400 -fmove-all-movables -freduce-all-givs -freorder-blocks -freorder-functions -fexpensive-optimizations -frename-registers -fweb -funit-at-a-time -fbranch-target-load-optimize -fbranch-target-load-optimize2 


* 折衷 CFLAGS (从加载速度跟执行效能折衷出来的 CFLAGS,大部份的人可能会想用这个): 
-march=<cpu-type> -mtune=<cpu-type> -mfpmath=sse,387 [-mmmx -msse -msse2 -msse3 -m3dnow] -pipe -Os -fomit-frame-pointer -fforce-addr -finline-functions -finline-limit=400 -fmove-all-movables -freduce-all-givs -freorder-blocks -freorder-functions -fexpensive-optimizations -falign-functions -falign-labels -falign-loops -falign-jumps -frename-registers -fweb -funit-at-a-time -fbranch-target-load-optimize -fbranch-target-load-optimize2 

请注意,这里列出的 CFLAGS 并不是最好的,也永远不会有最好的 CFLAGS。了解每个选项的用意与意义,组合最适合您的 CFLAGS 才是本章的要点,提供的 CFLAGS 只是作为参考用的。

来自: http://hi.baidu.com/20065562/blog/item/28997e31d5a83090a8018e5c.html