基于GCC的编译器的优化等级的执行原理

简介: 基于GCC的编译器的优化等级的执行原理

作者:良知犹存

前情提示:在使用基于GCC做编译器的IDE的时候,在很多时候我们会选择不同的Optimize优化等级,不同的优化等级,在Debug中我们发现程序执行的逻辑和我们设定的代码执行流程并不是很一致,甚至有时候差异巨大。所以我们来基于GCC介绍一下编译器优化执行的逻辑。

取自于官网:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

1.-O0:

  • 减少编译时间,这个是默认选项,一般我们做调试用这个选项,对于代码执行他不会做优化,代码执行会按照我们设置的逻辑。

2.-O,-O1:

  • 把这两个放置于一起,表明两种优化效果差不多,都是优化代码的大小以及代码执行的速度,但是编译时间会变得很大。
  • 优化的时候并开启如下的优化标志:

4edc953e2c684bbe819ffa954c899c08.png

3. -O2

  • 下面可以看到开启了例如finline-functions此类内联函数的优化,所以程序执行的效率更快,对于程序执行逻辑有比较多的修改,你会发现调试的时候打了断点执行,但是执行跳来跳去的。
    4edc953e2c684bbe819ffa954c899c08.png

4. -O3

  • 该选项除了执行-O2所有的优化选项之外,对于loop循环展开的优化开启更多,提高了程序执行效率,但是会以损失优化代码大小为条件。
  • 这种一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等。这个选项会提高执行代码的大小,当然会降低目标代码的执行时间。(摘自知乎)

4edc953e2c684bbe819ffa954c899c08.png

5. -Os

  • 这个优化标识和-O3有些异同,同是,都是基于-O2进行的更升一级的优化,但是,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度;-Os是尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。例如开启的优化标志中,有-fprefetch-loop-arrays -freorder-blocks-algorithm = stc等在内存中强制对齐数据,用来减少编译的程序代码的大小。

6. -Ofast:

  • 对-O3等级的更进一步的优化,fast名称就可以察觉到,它忽略严格的数据标准,以至于可以开启-ffast-math优化,使得程序更快。

知乎参考:https://www.zhihu.com/question/27090458


目录
相关文章
|
3月前
|
编译器 Linux 开发工具
|
4天前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
5 0
|
2月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
35 0
|
2月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
26 0
|
2月前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
|
3月前
|
C语言
gcc的简易用法(编译、参数与链接)
【5月更文挑战第14天】gcc的简易用法(编译、参数与链接)。
30 1
|
3月前
|
Unix Java 编译器
安装gcc
【5月更文挑战第14天】安装gcc。
62 1
|
3月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
68 0
006.gcc编译器
|
3月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
606 1
|
3月前
|
C语言
gcc的简易用法
【5月更文挑战第10天】gcc的简易用法。
42 8