免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2454 | 回复: 0
打印 上一主题 下一主题

编译优化,关于CFLAGS与CXXFLAGS [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-08 16:58 |只看该作者 |倒序浏览
     本文从金步国《gcc编译优化指南》
http://lamp.linux.gov.cn/Linux/optimize_guide.html
中摘抄可以个人可以理解和推荐使用的部分,留作参考。
一,CFLAGS 与 CXXFLAGS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且带有调试符号来编译,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事实上,"-O2"已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可。

-O3【-O1 ...-O3优化级别】
-finline-functions
允许编译器选择某些简单的函数在其被调用处展开,比较安全的选项,特别是在CPU二级缓存较大时建议使用

-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N
这四个对齐选项在"-O2"中打开,其中的根据不同的平台N使用不同的默认值。如果你想指定不同于默认值的N,也可以单独指定。比如,对于L2-cache>=1M的cpu而言,指定 -falign-functions=64 可能会获得更好的性能。建议在指定了 -march 的时候不明确指定这里的值。
全局选项:
-pipe
在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。【貌似只有在编译的时候起作用。
-fstack-check
为防止程序栈溢出而进行必要的检测,仅在多线程环境中运行时才可能需要它。
硬件体系结构相关选项[仅仅针对x86与x86_64]:
-march=cpu-type
为特定的cpu-type编译二进制代码(不能在更低级别的cpu上运行)。Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)
-mfpmath=sse
P3和athlon-xp级别及以上的cpu支持"sse"标量浮点指令。仅建议在P4和K8以上级别的处理器上使用该选项。
-mmmx
-msse
-msse2
-msse3
-m3dnow
-mssse3(GCC-4.3新增)
-msse4.1(GCC-4.3新增)
-msse4.2(GCC-4.3新增)
-msse4(含4.1和4.2,GCC-4.3新增)
是否使用相应的扩展指令集以及内置函数,按照自己的cpu选择吧!【请参照cat /proc/cpuinfo中flags:里面的信息】
传递给汇编器的选项:
-Wa,-march=CPU
按照特定的CPU进行优化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。【不解,和上边的-march有什么区别。】
仅可用于 CXXFLAGS 的选项:
-fvisibility-inlines-hidden
默认隐藏所有内联函数,从而减小导出符号表的大小,既能缩减文件的大小,还能提高运行性能,我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility=hidden 选项。
  
march指定的是当前cpu的架构,而mtune是真正作用于某一型号cpu的选项。
【一个相对安全的策略CFLAGS="-march=native -mtune=native 指令集参数 -pipe -O3"; CXXFLAGS 参数,直接让他等于 CLAGS 。CXXFLAGS="${CFLAGS}"】
二,LDFLAGS
是传递给连接器的选项。这是一个常被忽视的变量,事实上它对优化的影响也是很明显的。
-s   删除可执行程序中的所有符号表和所有重定位信息。其结果与运行命令 strip 所达到的效果相同,这个选项是比较安全的。
-Wl,--hash-style=gnu
使用gnu风格的符号散列表格式。它的动态链接性能比传统的sysv风格(默认)有较大提升,但是它生成的可执行程序和库与旧的Glibc以及动态链接器不兼容。
   最后将选定好的编译参数写入到某个环境变量的文件里。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94102/showart_1922415.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP