作者:良知犹存
前情提示:在使用基于GCC做编译器的IDE的时候,在很多时候我们会选择不同的Optimize优化等级,不同的优化等级,在Debug中我们发现程序执行的逻辑和我们设定的代码执行流程并不是很一致,甚至有时候差异巨大。所以我们来基于GCC介绍一下编译器优化执行的逻辑。
取自于官网:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
1.-O0:
- 减少编译时间,这个是默认选项,一般我们做调试用这个选项,对于代码执行他不会做优化,代码执行会按照我们设置的逻辑。
2.-O,-O1:
- 把这两个放置于一起,表明两种优化效果差不多,都是优化代码的大小以及代码执行的速度,但是编译时间会变得很大。
- 优化的时候并开启如下的优化标志:
3. -O2
- 下面可以看到开启了例如finline-functions此类内联函数的优化,所以程序执行的效率更快,对于程序执行逻辑有比较多的修改,你会发现调试的时候打了断点执行,但是执行跳来跳去的。
4. -O3
- 该选项除了执行-O2所有的优化选项之外,对于loop循环展开的优化开启更多,提高了程序执行效率,但是会以损失优化代码大小为条件。
- 这种一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。这个选项会提高执行代码的大小,当然会降低目标代码的执行时间。(摘自知乎)
5. -Os
- 这个优化标识和-O3有些异同,同是,都是基于-O2进行的更升一级的优化,但是,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度;-Os是尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。例如开启的优化标志中,有-fprefetch-loop-arrays -freorder-blocks-algorithm = stc等在内存中强制对齐数据,用来减少编译的程序代码的大小。
6. -Ofast:
- 对-O3等级的更进一步的优化,fast名称就可以察觉到,它忽略严格的数据标准,以至于可以开启-ffast-math优化,使得程序更快。
知乎参考:https://www.zhihu.com/question/27090458