GCC编译器优化选项分析及具体优化了什么
问题
在使用gcc作为编译器。在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下往往会出现很多种预料之外的结果,尤其在嵌入式环境中,程序在板子上运行的时候,问题就愈发明显。
为了了解具体为什么造成该问题,对两种模式下的配置做了对比
debug模式编译器参数为-O0 -g –Wall
release模式编译器参数为-O2 -g –Wall
通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?现在我们来看看gcc编译器的优化参数到底做了什么优化
-O0
这里只介绍优化编译的参数
-O用来开启优化编译选项。
-O0:默认模式,不做任何优化。
-O1
-O1:优化。该模式下对于一个大的函数或功能会花费更多的时间和内存。
在-O1下:编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作。
在该模式下将打开一下优化选项:
优化选项 | 描述 |
---|---|
-fdefer-pop | 推迟推出函数调用的参数,对于那些需要在函数调用后必须取出(pop)函数参数的机器而言,打开该项编译器将把函数调用的参数压入栈,等必要时几个函数调用参数一起取出(pop)。这将节省处理时间。 |
-fdelayed-branch | 如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed branch)指令后面的指令空隙. |
-fguess-branch-probability | 使用启发式算法预测分之指令,增加指令的命中率,提升运行效果。 |
-fcprop-registers | 使用寄存器之间copy-propagation传值,因为在函数中把寄存器分配给变量, 所以编译器执行第二次检查以便减少调度依赖性(两个段要求使用相同的寄存器)并且删除不必要的寄存器复制操作 |
-floop-optimize | 通过优化如何生成汇编语言中的循环, 编译器可以在很大程序上提高应用程序的性能。 通常, 程序由很多大型且复杂的循环构成。 通过删除在循环内没有改变值的变量赋值操作, 可以减少循环内执行指令的数量, 在很大程度上提高性能。 此外优化那些确定何时离开循环的条件分支, 以便减少分支的影响 |
-fif-conversion | if-then语句应该是应用程序中仅次于循环的最消耗时间的部分,简单的if-then语句可能在最终的汇编语言代码中产生众多的条件分支通过减少或者删除条件分支, 以及使用条件传送 设置标志和使用运算技巧来替换他们, 编译器可以减少if-then语句中花费的时间量。 |
-fif-conversion2 | 这种技术结合更加高级的数学特性, 减少实现if-then语句所需的条件分支。 |
-ftree-ccp | |
-ftree-dce | |
-ftree-dominator-opts | |
-ftree-dse | |
-ftree-ter | |
-ftree-lrs | |
-ftree-sra | |
-ftree-copyrename | |
-ftree-fre | |
-ftree-ch | |
-funit-at-a-time | |
-fmerge-constants |
该模式下在不影响调试的状况下还会打开‘-fomit-frame-pointer优化项。
同时该模式不会为Ada编译器打开‘-ftree-sra’优化项,如需要则请使用命令参数输入‘-ftree-sra’进行优化。
-O2
进一步优化.GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化。
-O2优化等级下,并不执行循环展开和函数“内联”优化操作。
与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码。
-O2除了打开-O1的所有优化参数外还打开以下优化选项。
优化选项 | 描述 |
---|---|
-fthread-jumps | |
-fcrossjumping | |
-foptimize-sibling-calls | |
-fcse-follow-jumps -fcse-skip-blocks | |
-fgcse -fgcse-lm | |
-fexpensive-optimizations | |
-fstrength-reduce | |
-frerun-cse-after-loop -frerun-loop-o | |
-fcaller-saves | |
-fpeephole2 | |
-fschedule-insns -fschedule-insns2 | |
-fsched-interblock -fsched-spec | |
-fregmove | |
-fstrict-aliasing | |
-fdelete-null-pointer-checks | |
-freorder-blocks -freorder-functions | |
-falign-functions -falign-jumps | |
-falign-loops -falign-labels | |
-ftree-vrp | |
-ftree-pre |
还要注意-fgcse下关于请求-O2优化等级的用于计算goto的程序。
-O3
-O3:更进一步优化。-O3打开-O2指定的所有优化操作并且打开:
-finline-functions
-funswitch-loops
-fgcse-after-reload
优化项-O3
-Os:针对程序空间大小优化(多用于嵌入式系统)。
-Os使能-O2中除去会增加程序空间的所有优化参数。同时-Os还会执行更加优化程序空间的选项。
-Os会关闭以下优化选项:
优化选项 | 描述 |
---|---|
-falign-functions | |
-falign-jumps | |
-falign-loops | |
-falign-labels | |
-freorder-blocks | |
-freorder-blocks-and-partition | |
-fprefetch-loop-arrays | |
-ftree-vect-loop-version |
关于GCC编译的优化选项一共有-O0(默认),-O1,-O2,-O3及-Os五个参数。
各个参数优选内容如上所示。
但是各个优化内容到底是指什么那?继续分析。
GCC编译器优化选项分析及具体优化了什么相关推荐
- LLVM代码空间优化(一) 编译器自带的优化选项
最近项目组遇到编译安全固件,超出了r52安全核SRAM自带空间问题.急需要找寻方法优化代码体积(代码段大小+数据段大小+stack+bss段)方法,目前初步分析只有代码段&数据段有优化的可能, ...
- 优化选项对ARM下指针赋值的影响
原文:http://www.thinksaas.cn/topics/0/484/484804.html 我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及- ...
- c语言定义禁止优化变量,c语言防止优化
c语言防止优化 编译器编令里有设置,通置,你可以要求 不优化,以要求种优化. 具体选项有哪些,要查自己编译器的帮助文件. 例如,MS VC++ 6.0 编译器编 优化选项: /O1:优化使产生的可执行 ...
- GCC编译器选项及优化提示
很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径: 因此献上此帖,以供各位玩家参考,绝对原创噢 =========== ...
- #linux# gcc编译器优化选项的详细信息
Table of Contents 优化选项-O0 优化选项-O1 优化选项-O2 优化选项-O3 优化选项-OS 支持CPU类型target gcc编译器优化选项O0, O1, O2, O3, Os ...
- gcc 优化选项 -O1 -O2 -O3 -Os 优先级
Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文件长度,执行效率}这个三维模型进行不同的取舍和平衡.优化的方法不一而足,总体上将有以 ...
- Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
关注.星标公众号,不错过精彩内容 整理:黄工 参考来源:Arm官网 使用过Keil MDK (Arm Compiler 6)编译器V6版本的读者应该发现了一个问题,V6版本速度比V5版本编译速度快很多 ...
- gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer(不积跬步无以至千里)
-fomit-frame-pointer 在优化时候被启用,带来了效率的提升.看到一篇比较详细记录编译选项的文章,转发一下,同时给自己作一下备忘. 少优化->多优化: O0 -->> ...
- gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】
转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...
最新文章
- python 玩公众号游戏_Python入门太难?不如从玩塔防小游戏开始,玩通关就能学会编程...
- 最优化学习笔记(一)——牛顿法(一维搜索方法)
- 计算机系统结构名词解释
- Aria2 基础配置及下载设置
- LeaRun快速开发平台:企业供应链管理系统解决方案
- 内存映射技术(共享内存)
- 只需要5秒就能克隆出你的声音
- 生成的html怎么做成桌面背景,定时改换图片的桌面背景 html页面
- android m1卡读写
- 弘辽科技:淘宝流量不稳定该如何应对
- MIT算法导论03-分治法
- 什么是802.11ax(Wi-Fi 6)
- BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Mode
- 计算机应用基础学习网站,《计算机应用基础》学习手册.pdf
- 带SN切换流程_抖音频繁切换账号会限流吗?抖音频繁切换账号会降权吗?
- 你问我答:U盘的CPU全部占满的处理办法——mfxp.com
- vivo X21的Usb调试模式在哪里,打开vivo X21Usb调试模式的步骤
- google recaptcha v2 and v3
- 摆脱重复操作,你值得拥有的自动化工具Automa|CSDN创作打卡
- 在java中以下 愿意5米的内容_请按时完成并提交作业