文章目录

  • 1. -O,-O1
  • 2. -O2
  • 3. -O3
  • 4. -Os
  • 5. -Ofast
  • 6.-Og

注意:用GDB调试的时候需要关闭优化选项

当优化标识被启用之后,gcc编译器将会试图在不改变程序语义的情况下改变程序的结构,
以满足代码大小最小或运行速度更快等目标

内容摘自:Options That Control Optimization

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

优化调试体验。 -Og应该是标准edit-compile-debug周期的优化级别选择,
在保持快速编译和良好调试体验的同时,提供合理的优化级别。
用于生成可调试代码,因为某些收集调试信息的编译器通道在以下位置被禁用 -O0。
像-O0 -Og完全禁用了许多优化过程,因此控制它们的单个选项无效。除此以外-Og 使所有 -O1 优化标志,但那些可能会干扰调试的标志除外:

-fbranch-count-reg
-fdelayed-branch
-fdse
-fif-conversion
-fif-conversion2
-finline-functions-called-once
-fmove-loop-invariants
-fssa-phiopt
-ftree-bit-ccp
-ftree-dse
-ftree-pta
-ftree-sra

gcc/g++ 优化标识 -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 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Google 鼓励的 13 条代码审查标准,建议收藏!
  2. wordpress发布时间 the_title()详细参数
  3. stm32 IAP APP 相互跳转实验 (keil4 jlink STM32F407ZE
  4. 26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题
  5. linux_perf_tools_full
  6. SLF4J with Logback in a Maven Project | Mograblog
  7. IT168技术开发频道一周精选2007-11-30
  8. 【APP】取代top工具的Linux运维利器--htop
  9. 金蝶k3服务器物理内存过高,金蝶k3提示超出内存解决方案
  10. 修改 xweibo 的memcache代码,让xweibo支持wincache,加快xweibo速度
  11. 创建第一个Android app项目
  12. 我的 2020 年终总结
  13. BZOJ 3224: Tyvj 1728 普通平衡树(替罪羊树)
  14. 数据结构队列的基本操作
  15. Redux or Mobx --前端应用状态管理方案的探索与思考
  16. rdkitnlp | smiles数据扩增与smiles标准化
  17. rhombus(菱形)
  18. 什么是逻辑卷管理器lvm?lvm设备的管理
  19. waylandweston
  20. 矢量切片地图前端开发tileserver-gl

热门文章

  1. 微信一年的支付限额满了20万,无法支付了怎么办?
  2. vue前端怎么导出图片_Vue将页面导出为图片或者PDF
  3. 微软全球最有价值专家(MVP) - 中国区2008年7月最有价值专家名录
  4. B站视频下载 bilibili 哔哩哔哩
  5. 【Turtle合集】提前祝大家圣诞快乐,我为大家献歌一首,叮叮当,叮叮当,穷的响叮当——快开门,我送礼物来了哟~(圣诞树代码)
  6. 分辨率、像素和PPI
  7. 移动化之后,BAT下一步走向何方?我们又该走向何方?
  8. 计算机远程桌面连接如何设置密码,远程桌面连接密码
  9. 缓存学习总结4(分布式缓存)
  10. vs2013界面内容_我在2013年阅读的内容