【2018-04-24】Gcc优化选项

发布时间:2026/7/18 5:34:25
【2018-04-24】Gcc优化选项 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-04-24 标题Gcc优化选项分类编程 标签gccGCC优化选项简单笔记参考链接《 https://blog.csdn.net/zhang626zhen/article/details/52988242 》gcc默认提供了5级优化选项的集合:-O0:无优化默认。-O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。在编译大型程序的时候会显著增加编译时内存的使用和时间。-O2: 此选项将增加编译时间和目标文件的执行性能。包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。编译器不执行循环展开以及函数内联。-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项并且执行专门减小目标文件大小的优化选项。-O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload and -ftree-vectorize优化选项。-O和-O1:o1是最基本的优化主要对代码的分支表达式常量来进行优化编译器会在较短的时间下将代码变得更加短小这样体积就会变得更小会减少内存的占用率在操作系统进行内存调度时就会更快。但是事情没有绝对的优点当一个庞大的程序被拆碎细分的话内存占用会大大增加由于当今系统大多数都是多线程就会出现卡顿和反应延迟。-O2进一步的优化。GCC会支持所有不涉及时间空间交换的所有支持的优化选项。当加入-o2选项时编译器不会进行循环展开和函数内联。与-O选项相比这个选项会增加编辑时间和合成码的性能。-O3:再一次的优化-O3选项会添加所有-O2中添加的选项并且添加-finline-functions,-funswitch-loops’ and -fgcse-after-reload’ 这三个选项。这个优化属于非常强大的优化因为编译器会进行预测对循环每一层的预测以便于将循环拆分可以提高执行效率。编译器还会试图用已有的值来代替未知的值并且还会用加代替乘因为运算器的特性乘法十分复杂耗时。当然o3的缺点最明显那就是o3因为试图预测程序的走向可能会出现误差导致错误和程序不可逆转的走向。所以一般o3不建议使用。这是最高最危险的优化等级。用这个选项会延长编译代码的时间并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x-O3生成的代码也只是比-O2快一点点而已而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件大大增加编译失败的机会或不可预知的程序行为包括错误。这样做将得不偿失记住过犹不及。在gcc 4.x.中使用-O3是不推荐的。-Os:原来**-Os相当于-O2.5。是使用了所有-O2的优化选项但又不增加代码尺寸的方法。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。**但也可能产生些许问题因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的。详细的说明如下Level 2.5 (-Os)The special optimization level (-Os orsize) enables all -O2 optimizations that do not increase code size; it puts theemphasis on size over speed. This includes all second-level optimizations,except for the alignment optimizations. The alignment optimizations skip spaceto align functions, loops, jumps and labels to an address that is a multiple ofa power of two, in an architecture-dependent manner. Skipping to theseboundaries can increase performance as well as the size of the resulting codeand data spaces; therefore, these particular optimizations are disabled.