首页 > 其他分享 >gcc 中-O -O1 -O2 -O3 -Os -Ofast -Og优化的原理

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

时间:2023-04-25 16:01:23浏览次数:38  
标签:选项 gcc blocks fipa falign Ofast O3 ftree 优化


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

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

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

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

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:

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

标签:选项,gcc,blocks,fipa,falign,Ofast,O3,ftree,优化
From: https://blog.51cto.com/u_16081664/6224234

相关文章

  • VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
    目录问题背景问题描述测试代码测试结果现象描述问题分析解决方案修改默认配置1.已经存在的文件全部使用gbk编码重新保存。2.在工程目录下新建.vscode目录,如果已存在则跳过此步骤。3.在.vscode目录中新建settings.json,launch.json两个文件,已有则跳过。4.settings.json文件添加......
  • GCC预处理、编译、汇编、链接全过程
    //hello.c#include<stdio.h>intmain(void){printf("Hello,world!\n");return0;} 预处理:替代宏,引入头文件cpphello.c>hello.i 编译:gcc-Wall-Shello.i(生成hello.s) 汇编:ashello.s-ohello.o(生成hello.o) 链接:复杂ld版:ld-dynamic-linke......
  • gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory
     01、安装 HTSeq软件出现如下报错,编译失败 02、原因是没有c++编译器,解决方法:aptinstallg++##安装c++编译器 03、再次安装HTseq,报错消失。 ......
  • taro3 报错 TypeError: className.split is not a function
    项目原来跑的好好的,昨天升级了几个包,引用了个UI库,然后今天上班运行项目就跑不起来了,项目是在旧的项目上升级的之前的写法<Viewkey={idx}className={["tabbar-item",isActive&&"active"]}onClick={this.switchTab.bind(this,item.key)}>{......
  • GCC相关
    GCC,theGNUCompilerCollection  https://gcc.gnu.org/ GCC:Anonymousread-onlyGitaccess  https://gcc.gnu.org/git.html browseourGithistoryonline https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git......
  • arm gcc undefined reference编译问题
    armgcc编译的时候,出现下面的错误。经检查,是因为添加了stdio.h,且调用了printf()函数,去掉了stdio.h和printf函数之后,编译通过。 ......
  • Mac安装gcc
    先安装brew:https://blog.csdn.net/weixin_38716347/article/details/123838344安装xcode:xcode-select--install安装gcc:brewinstallgcc检测gcc版本:gcc-v其他命令:清理brew:brewcleanupbrewcleanupgcc重新安装gcc:brewreinstallgcc......
  • taro3.6.4 在H5 端使用 tabBar 出现bug --- taro Cannot read properties of undefi
    taro3.6.4在H5端使用tabBar出现bug解决办法就是换版本3.6.2好像没有这个问题已经有人反馈了,https://github.com/NervJS/taro/issues/13581taroCannotreadpropertiesofundefined(reading'list')......
  • 【转】检查Linux系统下是否安装了gcc、pcre、zlib、openssl环境
    1.查看gcc环境gcc-v如果Linux系统没有安装gcc编译器,会提示“Commandnotfound”。如果系统上安装了gcc编译器,这条命令就会显示出当前安装的gcc编译器是哪个版本。下图展示为已安装的信息。 2. 查看pcre环境rpm-qapcre看到pcre的版本,说明已安装,否则未安装。......
  • gcc降级
    $sudoaptremovegcc$sudoapt-getinstallgcc-7g++-7-y$sudoln-s/usr/bin/gcc-7/usr/bin/gcc$sudoln-s/usr/bin/g++-7/usr/bin/g++$sudoln-s/usr/bin/gcc-7/usr/bin/cc$sudoln-s/usr/bin/g++-7/usr/bin/c++$gcc--version如果 sudoaptrem......