作者:知乎用户
链接:https://www.zhihu.com/question/27090458/answer/137944410
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

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

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

  1. -fauto-inc-dec
  2. -fbranch-count-reg
  3. -fcombine-stack-adjustments
  4. -fcompare-elim
  5. -fcprop-registers
  6. -fdce
  7. -fdefer-pop
  8. -fdelayed-branch
  9. -fdse
  10. -fforward-propagate
  11. -fguess-branch-probability
  12. -fif-conversion2
  13. -fif-conversion
  14. -finline-functions-called-once
  15. -fipa-pure-const
  16. -fipa-profile
  17. -fipa-reference
  18. -fmerge-constants
  19. -fmove-loop-invariants
  20. -freorder-blocks
  21. -fshrink-wrap
  22. -fshrink-wrap-separate
  23. -fsplit-wide-types
  24. -fssa-backprop
  25. -fssa-phiopt
  26. -fstore-merging
  27. -ftree-bit-ccp
  28. -ftree-ccp
  29. -ftree-ch
  30. -ftree-coalesce-vars
  31. -ftree-copy-prop
  32. -ftree-dce
  33. -ftree-dominator-opts
  34. -ftree-dse
  35. -ftree-forwprop
  36. -ftree-fre
  37. -ftree-phiprop
  38. -ftree-sink
  39. -ftree-slsr
  40. -ftree-sra
  41. -ftree-pta
  42. -ftree-ter
  43. -funit-at-a-time

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

  1. -fthread-jumps
  2. -falign-functions -falign-jumps
  3. -falign-loops -falign-labels
  4. -fcaller-saves
  5. -fcrossjumping
  6. -fcse-follow-jumps -fcse-skip-blocks
  7. -fdelete-null-pointer-checks
  8. -fdevirtualize -fdevirtualize-speculatively
  9. -fexpensive-optimizations
  10. -fgcse -fgcse-lm
  11. -fhoist-adjacent-loads
  12. -finline-small-functions
  13. -findirect-inlining
  14. -fipa-cp
  15. -fipa-cp-alignment
  16. -fipa-bit-cp
  17. -fipa-sra
  18. -fipa-icf
  19. -fisolate-erroneous-paths-dereference
  20. -flra-remat
  21. -foptimize-sibling-calls
  22. -foptimize-strlen
  23. -fpartial-inlining
  24. -fpeephole2
  25. -freorder-blocks-algorithm=stc
  26. -freorder-blocks-and-partition -freorder-functions
  27. -frerun-cse-after-loop
  28. -fsched-interblock -fsched-spec
  29. -fschedule-insns -fschedule-insns2
  30. -fstrict-aliasing -fstrict-overflow
  31. -ftree-builtin-call-dce
  32. -ftree-switch-conversion -ftree-tail-merge
  33. -fcode-hoisting
  34. -ftree-pre
  35. -ftree-vrp
  36. -fipa-ra

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

  1. -finline-functions // 采用一些启发式算法对函数进行内联
  2. -funswitch-loops // 执行循环unswitch变换
  3. -fpredictive-commoning //
  4. -fgcse-after-reload //执行全局的共同子表达式消除
  5. -ftree-loop-vectorize  //
  6. -ftree-loop-distribute-patterns
  7. -fsplit-paths
  8. -ftree-slp-vectorize
  9. -fvect-cost-model
  10. -ftree-partial-pre
  11. -fpeel-loops
  12. -fipa-cp-clone options

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

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

  1. -falign-functions
  2. -falign-jumps
  3. -falign-loops
  4. -falign-labels
  5. -freorder-blocks
  6. -freorder-blocks-algorithm=stc
  7. -freorder-blocks-and-partition
  8. -fprefetch-loop-arrays

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

  1. -fno-protect-parens
  2. -fstack-arrays

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

GCC编译选项 -OX[转]的更多相关文章

  1. (转载)gcc编译选项总结

    转载自:https://blog.csdn.net/gatieme/article/details/21389603 常用编译选项 gcc and g++分别是gnu的c & c++编译器 g ...

  2. 2015-08-26: GCC编译选项(转载)

    gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:           -Waddress -Warray-bounds (only with -O2) ...

  3. GCC编译选项

    一.看例子分析gcc 的编译选项 gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 1.-I /home/h ...

  4. GCC 编译选项

    http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html GCC 编译选项(转) gcc提供了大量的警告选项,对代码中可能存在的 ...

  5. 用于阻止缓冲区溢出攻击的 Linux 内核参数与 gcc 编译选项

    先来看看基于 Red Hat 与 Fedora 衍生版(例如 CentOS)系统用于阻止栈溢出攻击的内核参数,主要包含两项: kernel.exec-shield 可执行栈保护,字面含义比较“绕”, ...

  6. gcc编译选项汇集

    gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...

  7. [小技巧] gcc 编译选项-###

    原文译至:http://elinux.org/GCC_Tips 的一小部分. -###编译选项用于查看编译的过程 gcc -### <你的命令行的其他部分放在这里> 你运行的GCC其是一系 ...

  8. GCC 编译选项(转)

    转:http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html gcc提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常 ...

  9. c c++ 函数入口和出口的hook(gcc 编译选项),然后打印出函数调用关系的方法

    GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”.可查看gcc的man page来获取更详 ...

随机推荐

  1. wget 下载百度网盘文件

    上传文件到服务器,有许多种方法,罗列一下我用过的 xftps之类的工具 rz tz命令 git 上传到码云 通过wget方式,上传文件到百度网盘,七牛云等只要支持wget方式下载即可 下面介绍一下怎么 ...

  2. 翻译:MariaDB DATABASE()

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  3. 利用AndroidStudio开发java工程

    1.新建一个project,或者如果你已经有project的话,那就直接新建一个module.注意选择Java library,然后下一步. 2.输入module的一些信息.点击finish.(在创建 ...

  4. 《C++程序设计语言(十周年纪念版)》【PDF】下载

    <C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...

  5. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  6. C# 委托与事件详解(二)

    什么是事件?EVENT?点击事件?加载事件?一连串的模糊的概念冲击着我们弱小的脑袋 那我们首先来看一下比较正统的感念吧: 事件是类在发生其关注的事情时用来提供通知的一种方式. 事件的发生一般都牵扯2个 ...

  7. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  8. webpack 3.X学习之多页面打包

    简介 我们开发不可能只写一个页面,每次都要写很多页面,这时为了开发效率,我们使用前端自动化工具webpack,那么webpack是如何打包页面的呢?又是如何打包多页面的呢? 单页面打包 我们知道要打包 ...

  9. Say Hello to ConstraintLayout

    ConstraintLayout介绍 ConstraintLayout让你可以在很平的view结构(没有多层布局嵌套)中构建一个复杂的布局结构. 有点像RelativeLayout, 所有的view都 ...

  10. [C#]使用Quartz.NET来创建定时工作任务

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...