【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案
【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案
因代码运行时的优化需要,特在此记录 【-O1-O2-O3-Ofast…】C/C++编译器代码优化原理方案。
如果不指定优化标识的话,gcc 就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用 gdb 中的 p 命令查看变量的值、改变变量的值等。并且把获取最快的编译速度作为它的目标。
当优化标识被启用之后,gcc 编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源程序语义等价的前提之下),以满足某些目标,如:代码大小最小 或 运行速度更快(只不过通常来说,这两个目标是矛盾的,二者不可兼得)。
在不同的 gcc 配置和目标平台下,同一个标识所采用的优化种类也是不一样的。
可以使用 -Q --help =optimizers
来获取每个优化标识所启用的优化选项。
以下的每个优化标识都可以在 原网址 中找到对应的详细解释。
-O,-O1
在不影响编译速度的前提下,尽量采用一些优化算法,降低可执行代码的大小。
-O2
牺牲部分编译速度,除了执行 -O1
所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以 提高目标代码的运行速度。
-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
-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
-Ofast
该优化标识将不会严格遵循语言标准,除了启用所有的 -O3
优化选项之外,也会针对某些语言启用部分优化。如:-ffast-math
等。
同时 -Ofast
也会牺牲标准兼容性,以获得更快的运行速度。
-Og
该优化标识会选择部分与 -g
选项不冲突的优化选项,以提供合理的优化水平,同时产生较优秀的可调试信息。
关于这些优化选项的应用实例之一,请见:
SPN实现——限时1000ms的代换-置换网络加解密的时间优化思路
启用的优化标识为:
#pragma GCC optimize(3,"Ofast","inline")
https://www.zhihu.com/question/27090458 ↩︎
【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案相关推荐
- 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og
目录 优化等级 -O1 -O2 -O3 -Os -Ofast -Og cmake 生成 debug和 release 版|Cmake设置优化等级 优化等级 -O1 -O2 -O3 -Os -Ofast ...
- c++ -O1,-O2,-O3资料整理
原文:http://blog.csdn.net/xinianbuxiu/article/details/51844994 1.从.c文件到可执行文件,其间经历了几步? 高级语言是偏向人,按照人的思维方 ...
- gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer(不积跬步无以至千里)
-fomit-frame-pointer 在优化时候被启用,带来了效率的提升.看到一篇比较详细记录编译选项的文章,转发一下,同时给自己作一下备忘. 少优化->多优化: O0 -->> ...
- #gcc笔记01#gcc编译选项 -O0 -O1 -O2 -O3
-O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最(此处为大写字母O) 优化选项(来源:http://blog.csdn.net/Sodi ...
- gcc 优化选项 -O1 -O2 -O3 -Os 优先级
Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文件长度,执行效率}这个三维模型进行不同的取舍和平衡.优化的方法不一而足,总体上将有以 ...
- C++手动开启O2优化(以及-O -O1 -O2 -O3优化的知识点)(竞赛可用)
O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化. O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间. O3在O2的基础上进行更多的优化 ...
- gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理
一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用gdb中的 p命令查看变量的值,改变变量的值等.并且把获取最快的编译速度作为它的目标. ...
- GNU编译优化级别-O -O1 -O2 -O3
最近做一个算法的GPU加速,发现实际上使用gcc的-O3(最高级编译优化)选项,可以获得很高的加速比,我的程序里达到了3倍的样子,有时效果甚至比GPU加速好.因此小小学习了下GNU的编译优化. 附言一 ...
- makefile工作笔记0002---gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 相关博客http://blog.chinaunix.net/uid-24954950-id-295 ...
- gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】
转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...
最新文章
- 开始iOS 7中自动布局教程(一)
- spring二:装配bean(自动装配)
- 汇编 CALL和RET指令
- (转)java中对集合对象list的几种循环访问总结
- 【视频教程】JeeWx 微信开发入门视频
- 神奇的python(五)之python强制退出报错(异常)解决方法
- 再来过-docker
- zabbix3.2自动发现
- Response.Redirect导致session丢失的解决办法
- Spring对 JDBC 的支持,JdbcTemplate类的使用
- 新浪微博说说html,说说新浪微博
- transformer中的多头注意力机制
- hdu1728 逃离迷宫
- linux 终端显示的文件颜色的含义
- 1128UI自动化测试经验分享-显式等待(二)expected_conditions模块、visibility_of_element_located(locator)
- mycat 常用分片规则使用详解
- 推荐系统精排模型中的ID特征
- linux毁灭指令,那些致命的Linux命令
- vue项目接入unity3D模块并进行数据通信
- 用AI脑补慢动作,30帧秒变120帧,轻松看清“松果糖豆五连鞭”动作细节