内容发布更新时间 : 2024/12/23 2:47:56星期一 下面是文章的全部内容请认真阅读。
GCC编译器选项及优化提示
GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成\骨灰\玩法,却也不得不承认这是掌握gcc的绝佳途径;
因此献上此帖,以供各位玩家参考,绝对原创噢 =
大多数程序和库在编译时默认的优化级别是\使用gcc选项:\并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!
另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。 为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):
export CFLAGS=\
这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
\选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),
Intel通常是:
pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium-m,prescott,nocona
说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;
prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)
AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx
用AMD的一般都是DIYer,就不必解释了吧。
如果编译时没有抱怨\,那么你设定的\优化参数一般就没什么问题。
否则请降低优化级别(\取消)。
个人意见:服务器使用\就可以了,它是最安全的优化参数(集合);桌面可以使用\;
不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时\反而更慢)。
编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。
所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。
注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。
比如\将打开-finline-functions选项,但是可以用\inline-functions\既使用-O3的功能又关闭函数内嵌功能。
更多的优化选项请参见: 所有GCC选项完整列表参见: 有两个页面值的参考:
(对于gentoo-1.4)比较安全的优化选项 (对于gentoo-1.4)进阶优化选项 *
哦,忘了说一声,\已经启用绝大多数安全的优化选项了,所以其实你不必对那一堆选项发愁。
先说说\在\基础上增加的几项,你可以按需添加(还算比较安全): [gcc-3.4.4]
-finline-functions允许编译器选择某些简单的函数在其被调用处展开 -fweb为每个web结构体分配一个伪寄存器
-frename-registers试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。
[gcc-4.0.2]
-finline-functions说明如上
-funswitch-loops将循环体中不改变值的变量移动到循环体之外
-fgcse-after-reload*不太明白它的含义*[哪位大峡知道给小弟讲解一下,先行谢过