优化等级

gcc 提供了大量优化等级,用来对编译时间、目标文件大小、执行效率三个维度进行不同的取舍和平衡

  • -O0,最少的优化。(这是默认的编译选项)(可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处)
  • -O-O1,有限优化。(编译时占用稍微多的时间和相当大的内存,减少代码生成尺寸、缩短执行时间)(去除无用的 inline 和无用的 static 函数、死代码消除等,在影响到调试信息的地方均不进行优化,在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级)
  • -O2,高度优化。(在 -O1 的基础上,尝试更多的寄存器级的优化以及指令级的优化)(调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联)
  • -O3,最大程度优化。(在 -O2 的基础上,针对循环进行更多的优化,更激进的函数内陆等)
  • -Os,相当于 -O2.5。使用了所有 -O2 的优化选项,但又不缩减代码尺寸的方法。

实战演练

使用 STM32CubeMX 新建一个简单 demo,并用 Keil5 打开,使用 STM32CubeMX 创建的工程,gcc 编译优化等级默认为 -O3。
在 main() 函数里有一句 int a = 100;,打开仿真,发现这句被编译成的汇编语句为

MOVS r0,#0x64

即,将 r0 寄存器赋值为 100,就没有然后了。


我们手动将优化等级改为 -O0,重新看 int a = 100; 对应的汇编语句,发现是两句

MOVS r0,#0x64
STR  r0,[sp,#0x00]

即,将 r0 寄存器赋值为 100,然后将 r0 寄存器中的值设置到 sp + 0x00 对应的内存位置,sp 即为栈顶。因为 a 是 main() 函数中第一个定义的变量,所以正好处于栈顶。

两者对比,-O3 优化的结果是:int a = 100; 语句并没有将 a 对应的内存真正的赋值为 100,而是等到后面使用时再进行赋值(已证实),这样做的好处是,如果后续没有对 a 的访问,真正的赋值工作可以不用做了。
-O0 由于没有优化,所以 int a = 100; 语句就乖乖地将 a 对应的内存真正的赋值 100 了。

调试的时候,要使用 -O0,不然你大概率会发现程序并不是按照你预期的顺序执行的。

gcc -O0 -O1 -O2 -O3 -Os 编译优化等级相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理

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

  9. makefile工作笔记0002---gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 相关博客http://blog.chinaunix.net/uid-24954950-id-295 ...

  10. GNU编译优化级别-O -O1 -O2 -O3

    最近做一个算法的GPU加速,发现实际上使用gcc的-O3(最高级编译优化)选项,可以获得很高的加速比,我的程序里达到了3倍的样子,有时效果甚至比GPU加速好.因此小小学习了下GNU的编译优化. 附言一 ...

最新文章

  1. VIEW层AJAX提交表单到Controller的实体(AJAX传递序列化的输入元素)
  2. Factory模式与Prototype模式的异同
  3. SSM中shiro的基本使用
  4. 攻防世界第四题Reverse re1
  5. LeetCode 2039. 网络空闲的时刻(BFS)
  6. springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)
  7. 二进制高低位交换の琐事(洛谷P1100题题解,Java语言描述)
  8. 最强云硬盘来了,让AI模型迭代从1周缩短到1天
  9. 16岁学计算机,16岁学生能学计算机吗
  10. idea 查看实现类快捷键及类里面的方法对应的快捷键、跳到下一行
  11. Cocos2dx源码记录(3) CCVertexIndexData
  12. hadoop2.2.0 core-site.xml--global properties
  13. 结合使用 Oracle Coherence 和 Spring Batch 进行高性能数据处理
  14. 计算机的键盘应用,电脑键盘应用小知识
  15. form表单label加问号图标以及提示词
  16. 360与腾讯之争之厚黑学分析
  17. 递归算法之八皇后问题
  18. 下面哪个不是python合法的变量名_下面哪个不是Python合法的标识符
  19. 6846. 【2020.11.02提高组模拟】旅人1970
  20. 未收到服务器返回信息吗,inode 未收到服务器回应

热门文章

  1. Numpy的各种下标操作
  2. matlab实时编辑器怎么用,Markdown 实时编辑器
  3. LVGL (9) Event 机制实现
  4. python第五章课后答案汉诺塔_python 习题
  5. 使用AVSpeechSynthesizer添加文本转语音的功能
  6. 无线路由器介绍和有线路由器上网
  7. drools中Fact的equality modes
  8. 小马激活报错:已停止工作
  9. C++ 实现贪吃蛇游戏(免费附源码)
  10. 华为鸿蒙星星之火,星星之火 数码视讯支持华为鸿蒙发布会全球直播