【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案

本文介绍了C/C++编译器的代码优化方案,包括-O1、-O2、-O3和-Ofast等标识的优化原理。这些标识用于调整编译器行为,优化目标包括代码大小和运行速度。通过启用不同级别的优化,开发者可以在调试友好性和执行效率之间找到平衡。文章提到了在不同配置和平台下,优化选项的差异,并提醒开发者关注优化可能带来的副作用,如代码膨胀。
摘要由CSDN通过智能技术生成

【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案

因代码运行时的优化需要,特在此记录 【-O1-O2-O3-Ofast…】C/C++编译器代码优化原理方案

  • 如果不指定优化标识的话,gcc 就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用 gdb 中的 p 命令查看变量的值、改变变量的值等。并且把获取最快的编译速度作为它的目标。

  • 当优化标识被启用之后,gcc 编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源程序语义等价的前提之下),以满足某些目标,如:代码大小最小运行速度更快(只不过通常来说,这两个目标是矛盾的,二者不可兼得)。

在不同的 gcc 配置和目标平台下,同一个标识所采用的优化种类也是不一样的。

可以使用 -Q --help =optimizers 来获取每个优化标识所启用的优化选项。

以下的每个优化标识都可以在 原网址 中找到对应的详细解释。

  1. -O,-O1

在不影响编译速度的前提下,尽量采用一些优化算法,降低可执行代码的大小

  1. -O2

牺牲部分编译速度,除了执行 -O1 所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以 提高目标代码的运行速度

  1. -O3

除了执行 -O2 所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代 CPU 中的流水线、Cache等。这个选项会提高执行代码的大小,而可以 提高目标代码的运行速度

由于 -O3 是以提高执行速度为目的来扩展代码大小,如增加内联等,但过度膨胀反而可能降低执行速度,故而在两者之间取得某种平衡。

其开启的优化选项如下:

-finline-functions
-funswitch-loops
-fpredictive-commoning
-fgcse-after-reload
-ftree-loop-vectorize
-ftree-loop-distribute-patterns
-fsplit-paths 
-ftree-slp-vectorize
-fvect-cost-model
-ftree-partial-pre
-fpeel-loops 
-fipa-cp-clone options
  1. -Os

该优化标识和 -O3 的目的恰好相悖。

-Os 会在 -O2 的基础上尽量降低目标代码的大小,压缩代码空间,对嵌入式设备等存储容量小的设备较为重要。

为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白1(alignment padding)。

-falign-functions  
-falign-jumps  
-falign-loops 
-falign-labels
-freorder-blocks  
-freorder-blocks-algorithm=stc 
-freorder-blocks-and-partition  
-fprefetch-loop-arrays
  1. -Ofast

该优化标识将不会严格遵循语言标准,除了启用所有的 -O3 优化选项之外,也会针对某些语言启用部分优化。如:-ffast-math 等。

同时 -Ofast 也会牺牲标准兼容性,以获得更快的运行速度。

  1. -Og

该优化标识会选择部分与 -g 选项不冲突的优化选项,以提供合理的优化水平,同时产生较优秀的可调试信息。


关于这些优化选项的应用实例之一,请见:

SPN实现——限时1000ms的代换-置换网络加解密的时间优化思路

启用的优化标识为:

	#pragma GCC optimize(3,"Ofast","inline")

  1. https://www.zhihu.com/question/27090458 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值