基于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


目录
打赏
0
0
3
0
10
分享
相关文章
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
115 23
深入理解GCC 和 G++ 编译器
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
156 11
|
5月前
|
1.8.3 GNU编译器集合和LLVM项目
GNU项目自1987年起致力于开发自由UNIX软件,其成果之一GNU编译器集合(GCC)在指导委员会领导下持续演进,紧跟C语言标准。GCC适用于多种平台如UNIX、Linux和Windows,并常通过gcc或cc命令调用。另一方面,起源于2000年伊利诺伊大学研究项目的LLVM,提供了另一种开源编译器集合,其Clang编译器处理C代码,自2012年起成为FreeBSD默认C编译器,并良好支持最新C标准。
88 1
MinGW安装gcc
MinGW安装gcc
161 0
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……