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

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

在不同的gcc配置和目标平台下,同一个标识所采用的优化种类也是不一样的,这可以使用-Q --help =optimizers来获取每个优化标识所启用的优化选项。

下面每个-f**优化标识都可以在上述链接中找到解释

1.-O,-O1:

这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。并开启如下的优化选项:

-fauto-inc-dec

-fbranch-count-reg

-fcombine-stack-adjustments

-fcompare-elim

-fcprop-registers

-fdce

-fdefer-pop

-fdelayed-branch

-fdse

-fforward-propagate

-fguess-branch-probability

-fif-conversion2

-fif-conversion

-finline-functions-called-once

-fipa-pure-const

-fipa-profile

-fipa-reference

-fmerge-constants

-fmove-loop-invariants

-freorder-blocks

-fshrink-wrap

-fshrink-wrap-separate

-fsplit-wide-types

-fssa-backprop

-fssa-phiopt

-fstore-merging

-ftree-bit-ccp

-ftree-ccp

-ftree-ch

-ftree-coalesce-vars

-ftree-copy-prop

-ftree-dce

-ftree-dominator-opts

-ftree-dse

-ftree-forwprop

-ftree-fre

-ftree-phiprop

-ftree-sink

-ftree-slsr

-ftree-sra

-ftree-pta

-ftree-ter

-funit-at-a-time

2. -O2

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

-fthread-jumps

-falign-functions  -falign-jumps

-falign-loops  -falign-labels

-fcaller-saves

-fcrossjumping

-fcse-follow-jumps  -fcse-skip-blocks

-fdelete-null-pointer-checks

-fdevirtualize -fdevirtualize-speculatively

-fexpensive-optimizations

-fgcse  -fgcse-lm

-fhoist-adjacent-loads

-finline-small-functions

-findirect-inlining

-fipa-cp

-fipa-cp-alignment

-fipa-bit-cp

-fipa-sra

-fipa-icf

-fisolate-erroneous-paths-dereference

-flra-remat

-foptimize-sibling-calls

-foptimize-strlen

-fpartial-inlining

-fpeephole2

-freorder-blocks-algorithm=stc

-freorder-blocks-and-partition -freorder-functions

-frerun-cse-after-loop

-fsched-interblock  -fsched-spec

-fschedule-insns  -fschedule-insns2

-fstrict-aliasing -fstrict-overflow

-ftree-builtin-call-dce

-ftree-switch-conversion -ftree-tail-merge

-fcode-hoisting

-ftree-pre

-ftree-vrp

-fipa-ra

3. -O3

该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。

-finline-functions      // 采用一些启发式算法对函数进行内联

-funswitch-loops        // 执行循环unswitch变换

-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

这个选项会提高执行代码的大小,当然会降低目标代码的执行时间。

4. -Os

这个优化标识和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白(alignment padding)

-falign-functions

-falign-jumps

-falign-loops

-falign-labels

-freorder-blocks

-freorder-blocks-algorithm=stc

-freorder-blocks-and-partition

-fprefetch-loop-arrays

5. -Ofast:

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

-fno-protect-parens

-fstack-arrays

6.-Og:

该标识会精心挑选部分与-g选项不冲突的优化选项,当然就能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度。

gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理相关推荐

  1. 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og

    目录 优化等级 -O1 -O2 -O3 -Os -Ofast -Og cmake 生成 debug和 release 版|Cmake设置优化等级 优化等级 -O1 -O2 -O3 -Os -Ofast ...

  2. gcc 优化选项 -O1 -O2 -O3 -Os 优先级

    Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文件长度,执行效率}这个三维模型进行不同的取舍和平衡.优化的方法不一而足,总体上将有以 ...

  3. gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer(不积跬步无以至千里)

    -fomit-frame-pointer 在优化时候被启用,带来了效率的提升.看到一篇比较详细记录编译选项的文章,转发一下,同时给自己作一下备忘. 少优化->多优化: O0 -->> ...

  4. #gcc笔记01#gcc编译选项 -O0 -O1 -O2 -O3

    -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最(此处为大写字母O) 优化选项(来源:http://blog.csdn.net/Sodi ...

  5. Makefile 中 -wl ,rpath 以及 O0 O1 O2 O3 Os 的用法

    再makefile中一般默认的 lib 的加载路径是/lib /usr/lib  如果想要改变程序运行时的libs的加载路径 就需要用到 -wl , rpath 参数来添加lib 加载路径. O0 O ...

  6. c++ -O1,-O2,-O3资料整理

    原文:http://blog.csdn.net/xinianbuxiu/article/details/51844994 1.从.c文件到可执行文件,其间经历了几步? 高级语言是偏向人,按照人的思维方 ...

  7. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】

    转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...

  8. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

    相关博客http://blog.chinaunix.net/uid-24954950-id-2956476.html 相关博客http://blog.csdn.net/misiter/article/ ...

  9. C++手动开启O2优化(以及-O -O1 -O2 -O3优化的知识点)(竞赛可用)

    O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化. O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间. O3在O2的基础上进行更多的优化 ...

最新文章

  1. 增强学习(三)----- MDP的动态规划解法
  2. xp系统web服务器搭建教程,Windows_XP配置WEB服务器教程(图)
  3. Dr. Evil Underscores(异或最大值最小)
  4. 快学Scala习题解答—第一章 基础
  5. Mr.J-- HTTP学习笔记(四)-- 连接管理
  6. 诺基亚100G光传输网络助力Jio泛印度4G网络大幅增长
  7. UA MATH524 复变函数 用保形映射解Laplace方程的边值问题
  8. linux-xfce4-panel
  9. 连接方法:网线水晶头接法
  10. 正反馈、负反馈傻傻分不清?看这篇电路深度讲解
  11. VS Code开源软件介绍——史上最优秀的 IDE ?
  12. BUUCTF web(三)
  13. python studing DAY1
  14. 把maven的setting配置文件改为需要jdk版本
  15. c语言变量按作用域范围分两种,第02天C语言(10):变量-作用域
  16. vue 封装折叠面板加动画效果
  17. dotNetFx40_Client_x86_x64和dotNetFx40_Full_x86_x64这两个有什么区别?两个都要安装还是安装其中一个?...
  18. Boom 3D序列号授权超赞的音效增强及播放工具
  19. VS2015自定义安装字体DejaVu Sans Mono
  20. 垃圾回收概述(垃圾回收算法)

热门文章

  1. Tesseract-Ocr图片内容识别
  2. hadoop - hadoop2.6 伪分布式 示例 wordcount 分词 和 hdfs常用操作命令
  3. 简述python在量化金融中应用_Python金融量化
  4. 【python爬虫专项(23)】利用Selenium实现网页账号登录(以豆瓣网为例)
  5. RIS前言技术讲座系列
  6. 阿里云——云迁移中心
  7. Go语言为什么值得学习?
  8. SQL Server 定时自动备份和自动删除方法图文超详细步骤
  9. VIP邮箱套餐对比,163、TOM、新浪哪家VIP邮箱最全能?
  10. Vmware虚拟机Linux配置固定IP地址(详细版)