GCC 编译优化等级

2023-05-16

参考资料:《Using the GNU Compiler Collection》

打开优化标志会使编译器尝试以牺牲编译时间和调试程序的能力为代价来提高性能和/或代码大小。

根据目标和 GCC 的配置方式,在每个“-O”级别启用的优化设置可能与此处列出的设置略有不同。 您可以使用“-Q --help=optimizers”调用 GCC,以找出在每个级别启用的确切优化集。

如果您使用多个“-O”选项,无论有无级别编号,最后一个这样的选项是有效的那个。


-O1 优化。 优化编译需要更多时间,大型函数需要更多内存。使用“-O1”,编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。‘-O1’ 打开以下优化标志:

-fauto-inc-dec  #将地址的递增或递减与内存访问相结合。
-fbranch-count-reg  #
-fcombine-stack-adjustments #跟踪堆栈调整(推送和弹出)和堆栈内存引用,然后尝试找到组合它们的方法。
-fcompare-elim #在寄存器分配和post-register分配指令拆分之后,识别计算处理器标志的算术指令,类似于基于该算术的比较操作。
-fcprop-registers #在寄存器分配和post-register分配指令拆分之后,执行复制传播pass以尝试减少调度依赖并偶尔消除复制。
-fdce #在 RTL 上执行dead code消除 (DCE)。 
-fdefer-pop #允许编译器让参数在堆栈上为多个函数调用累积并一次全部弹出。
-fdelayed-branch #如果目标机器支持,尝试重新排序指令以利用延迟分支指令后可用的指令槽。
-fdse #在 RTL 上执行dead store消除 (DSE)。
-fforward-propagate #在 RTL 上执行前向传播pass。 pass 尝试结合两个指令并检查结果是否可以简化。 如果循环展开处于活动状态,则执行两次pass,并在循环展开之后安排第二次pass。
-fguess-branch-probability #使用启发式猜测分支概率。
-fif-conversion #尝试将条件跳转转换为无分支的等效项。
-fif-conversion2 #使用条件执行(如果可用)将条件跳转转换为无分支的等效项。
-finline-functions-called-once #考虑所有调用一次的静态函数以内联到它们的调用者,即使它们没有标记为内联。
-fipa-modref #执行过程间 mod/ref 分析。
-fipa-profile #执行过程间配置文件传播。
-fipa-pure-const #发现哪些函数是纯函数或常数。
-fipa-reference #发现哪些静态变量不会逃逸编译单元。
-fipa-reference-addressable #发现只读、只写和不可寻址的静态变量。
-fmerge-constants #尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。
-fmove-loop-invariants #在 RTL 循环优化器中启用loop invariant motion pass。
-fmove-loop-stores #在 GIMPLE 循环优化器中启用loop store motion pass。
-fomit-frame-pointer #在不需要的函数中省略帧指针。
-freorder-blocks #重新排序编译函数中的基本块,以减少采用的分支数量并提高代码局部性。
-fshrink-wrap #仅在需要它的函数部分之前发出函数序言,而不是在函数的顶部。
-fshrink-wrap-separate #分别收缩包装序言和尾声的单独部分,以便仅在需要时执行这些部分。
-fsplit-wide-types #当使用占用多个寄存器的类型时,例如 32 位系统上的 long long ,将寄存器分开并独立分配。
-fssa-backprop #在定义链上传播有关值使用的信息,以简化定义。
-fssa-phiopt #在 SSA PHI 节点上执行模式匹配以优化条件代码。
-ftree-bit-ccp #在树上执行稀疏的条件位常数传播并传播指针对齐信息。
-ftree-ccp #在树上执行稀疏条件常数传播 (CCP)。
-ftree-ch #在树上执行循环头复制。
-ftree-coalesce-vars #在将程序转换为 SSA 表示形式时,尝试通过合并不同用户定义变量的版本来减少复制,而不仅仅是编译器临时变量。
-ftree-copy-prop #在树上执行复制传播。 此遍消除了不必要的复制操作。
-ftree-dce #对树执行dead code消除 (DCE)。
-ftree-dominator-opts #基于支配树遍历执行各种简单的标量清理(常量/复制传播、冗余消除、范围传播和表达式简化)。
-ftree-dse #对树执行dead store消除 (DSE)。
-ftree-forwprop #在树上执行前向传播。
-ftree-fre #对树执行完全冗余消除 (FRE)。
-ftree-phiprop #从树上的条件指针执行负载提升。
-ftree-pta #对树执行函数局部点分析。
-ftree-scev-cprop #执行循环最终值替换。
-ftree-sink #在树上执行前向存储运动。
-ftree-slsr #对树进行直线强度降低。 这可以识别涉及乘法的相关表达式,并在可能的情况下用成本较低的计算替换它们。
-ftree-sra #执行聚合的标量替换。 此过程将结构引用替换为标量,以防止过早将结构提交到内存。
-ftree-ter #在 SSA->normal 阶段执行临时表达式替换。
-funit-at-a-time #出于兼容性原因,保留此选项。 '-funit-at-a-time' 没有效果,而“-fno-unit-at-a-time”意味着 “-fno-toplevel-reorder” 和 '-fno-section-anchors'。

-O2优化。进一步优化。 GCC 执行几乎所有支持的优化,不涉及空间速度折衷。 与“-O1”相比,此选项增加了编译时间和生成代码的性能。‘-O2’ 打开所有由 ‘-O1’ 指定的优化标志。 它还打开以下优化标志:

-falign-functions -falign-jumps
-falign-labels -falign-loops
-fcaller-saves
-fcode-hoisting
-fcrossjumping
-fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks
-fdevirtualize -fdevirtualize-speculatively
-fexpensive-optimizations
-ffinite-loops
-fgcse -fgcse-lm
-fhoist-adjacent-loads
-finline-functions
-finline-small-functions
-findirect-inlining
-fipa-bit-cp -fipa-cp -fipa-icf
-fipa-ra -fipa-sra -fipa-vrp
-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
-fschedule-insns -fschedule-insns2
-fsched-interblock -fsched-spec
-fstore-merging
-fstrict-aliasing
-fthread-jumps
-ftree-builtin-call-dce
-ftree-loop-vectorize
-ftree-pre
-ftree-slp-vectorize
-ftree-switch-conversion -ftree-tail-merge
-ftree-vrp
-fvect-cost-model=very-cheap

-O3优化。 ‘-O3’ 开启所有由 ‘-O2’ 指定的优化,同时开启以下优化标志:

-fgcse-after-reload
-fipa-cp-clone -floop-interchange
-floop-unroll-and-jam
-fpeel-loops
-fpredictive-commoning
-fsplit-loops
-fsplit-paths
-ftree-loop-distribution
-ftree-partial-pre
-funswitch-loops
-fvect-cost-model=dynamic
-fversion-loops-for-stride

-O0 减少编译时间并使调试产生预期的结果。这是默认值。


-Os 优化大小。 “-Os”启用所有“-O2”优化,除了那些经常增加代码大小的优化:

-falign-functions 
-falign-jumps
-falign-labels 
-falign-loops
-fprefetch-loop-arrays 
-freorder-blocks-algorithm=stc

它还启用“-finline-functions”,使编译器调整代码大小而不是执行速度,并执行旨在减少代码大小的进一步优化。


-Ofast 无视严格的标准合规性。 “-Ofast”启用所有“-O3”优化。 它还支持并非对所有符合标准的程序都有效的优化。 它打开“-ffast-math”、“-fallow-store-data-races”和特定于 Fortran 的“-fstack-arrays”,除非指定了“-fmax-stack-var-size”和“-fno-protect-parens’。 它关闭“-fsemantic-interposition”。


-Og 优化调试体验。 “-Og”应该是标准编辑-编译-调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。对于生成可调试代码来说,它是比‘-O0’更好的选择,因为一些收集调试信息的编译器通道在‘-O0’处被禁用。与“-O0”一样,“-Og”完全禁用了许多优化通道。 “-Og”会启用所有“-O1”优化标志,除了下面这些可能会干扰调试的优化标志:

-fbranch-count-reg
-fdelayed-branch
-fdse 
-fif-conversion 
-fif-conversion2
-finline-functions-called-once
-fmove-loop-invariants 
-fmove-loop-stores 
-fssa-phiopt
-ftree-bit-ccp 
-ftree-dse 
-ftree-pta 
-ftree-sra

-Oz 积极优化尺寸而不是速度。这可能会增加执行的指令的数量, 如果这些指令可以用更少的字节来编码。 “-Oz”的行为类似于“-Os”,包括启用大多数“-O2”优化。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC 编译优化等级 的相关文章

  • 最详细整理STL之vector基础

    前言 xff1a Vector是一种可以存储任意类型的动态数组 xff0c 属于序列式容器 xff0c 可以用sort对其进行排序 xff0c 底层数据结构是数组 xff0c 可以随机访问元素 Vectors 包含着一系列连续存储的元素 其
  • STL之vector扩容机制

    前言 大家好 xff0c 我是萝卜 上期结尾说到vector的push back操作一般情况下时间复杂度为O 1 xff0c 是否存在特殊情况 那么本期就讲讲vector在容器空间不足时进行push back操作会发生什么 vector作为
  • 求职嵌入式软件开发linux kernel/BSP leader/工程师职位

    个人工作说明 xff1a 目前从事linux系统网络设备的开发工作 xff0c 负责bootloader linux kernel文件系统 xff0c driver移植 xff0c 以及开源app移植 主要技能和过去的经验 xff1a 1
  • 【2023最新】计算机网络面试题【收藏持续更新】

    你好 xff0c 我是萝卜 xff0c 我会在本篇文章持续更新关于计算机网络的面试题 最新内容更新日期 xff1a 2023 04 11 基础 说一下计算机网络体系结构 网络体系结构一般有三种 xff1a ISO七层模型 xff0c TCP
  • UDP协议详解

    概述 xff1a UDP只在IP的数据报服务之上增加了两个最基本的服务 xff1a 复用和分用以及差错检测 UDP不保证可靠交付 xff0c 但是不意味着应用对数据的要求是不可靠的 xff0c 只是所有维护可靠性的工作可由用户在应用层完成
  • TCP传输可靠性保证机制之重传机制

    TCP重传机制 tcp重传机制包括超时重传 快速重传 带选择确认的重传 SACK 重复SACK 四种 超时重传 xff1a 超时重传是tcp协议保证数据可靠性的一个重要机制 原理是在发送某一个数据以后开启一个计时器 xff0c 在一定时间内
  • VSCode:终端控制台常用指令

    常用的指令 以下是一些在 Visual Studio Code 终端控制台中常用的指令 xff1a 1 清除终端 xff1a clear 2 列出当前目录中的文件和文件夹 xff1a ls 3 切换到指定目录 xff1a xff1a cd
  • Ubuntu18.04安装ROS时rosdep update报错解决办法

    在安装ros进行rosdep update时经常会报错 xff0c 有时候可以通过换网解决 xff0c 但从我安装那么多次的经验来看 xff0c 仅有一次换手机热点后更新成功了 xff0c 其他都是失败 xff0c 成功率太低 从网上搜到了
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信 xff08 Serial Communications xff09 实现单片机与电脑或者其它外设进行通信 xff0c 通信时只需两根线 xff08 TX xff0c RX xff09 就可以实现数据传输 STM32f103有三个串
  • C语言学习笔记——(2)数组

    数组 1 什么是是数组2 数组的定义2 1数组的表达2 2数组的含义2 3数组的大小 xff1a 3 字符数组4 字符串操作5 二维数组 1 什么是是数组 数组是指有序的元素序列 如果将有限个类型相同的变量的集合命名 xff0c 那么这个名
  • 多线程编程实验

    xff08 一 xff09 查看下列程序并运行 xff0c 掌握如何通过扩展Thread类创建线程 span class token keyword package span span class token namespace case1
  • 实验一:基于Ubuntu系统实现无人机自主飞行

    ps xff1a 为避免出现错误 xff0c 在进行新的一步时 xff0c 需要关闭由于上一步操作打开的终端 xff0c 并开启一个新的终端 例如 xff1a 在开始第5步 安装MAVROS 之前 xff0c 关闭由于第3步 安装ROS 打
  • 5000字学习C语言错误处理的四种方式。

    C错误处理 在C语言中 xff0c 错误处理是一个非常重要的主题 通常情况下 xff0c 程序员需要在代码中处理错误 xff0c 以保证程序能够在出现错误时正确地处理这些情况 C语言中常见的错误类型包括 xff1a 语法错误 逻辑错误 运行
  • yum 源制作

    YUM介绍 YUM主要用于自动升级 安装 移除 rpm 软件包 xff0c 它能自动查找并解决 rpm 包之间的依赖关系 xff0c 要成功的使用 YUM 工具更新系统和软件 xff0c 需要有一个包含各种 rpm 软件包的 reposit
  • MATLAB021b与VS2022混编

    MATLAB2021b与VS2022混编 前言 目前在做一个大创项目 xff0c 其中用到关于Matlab与C的混合编程 xff0c 特此记录 Matlab2021b 如图所示 xff0c 红线划出的是即将使用的 c函数 xff0c 在左侧
  • 香橙派5使用NPU加速yolov5的实时视频推理(一)

    前言 xff1a 寒假里 xff0c 博主完成了树莓派4B搭载yolofastest V2的ncnn加速 xff0c 效果挺不错的 xff0c 但总感觉还是稍微差点意思 xff0c 于是就购买了一块香橙派5 xff0c 想要用RK3588芯
  • 香橙派5使用NPU加速yolov5的实时视频推理(二)

    三 将best onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20 04系统中了 xff0c 我的Ubuntu系统中已经下载好了anaconda xff0c 使用anaconda的好处就是可以方便的安装一些库 xff0c 而且
  • 【STM32学习】——串口通信协议&STM32-USART外设&数据帧/输入数据策略/波特率发生器&串口发送/接受实操

    文章目录 前言一 串口通信1 通信接口2 串口通信 xff08 1 xff09 串口简介 xff08 2 xff09 串口硬件电路 xff08 3 xff09 串口软件部分 二 STM32的USART外设1 USART简介2 图示详解 三
  • 【STM32学习】——USART串口数据包&HEX/文本数据包&收发流程&串口收发HEX/文本数据包实操

    文章目录 前言一 数据包格式 xff08 江科大规定 xff09 1 HEX数据包2 文本数据包3 两者对比 二 数据包收发流程1 HEX数据包接收 xff08 只演示固定包长 xff09 2 文本数据包接收 xff08 只演示可变包长 x
  • buuctf simplerev 中的小头位序

    33条消息 BUUCTF SimpleRev xff08 涉及大小端序存储的问题 xff09 Ireb9z的博客 CSDN博客 buuctfsimplerev https blog csdn net afanzcf article deta

随机推荐

  • 简要分析网络编程——UDP编程

    计算机网络是指两台或更多的计算机组成的网络 xff0c 在同一个网络中 xff0c 任意两台计算机都可以直接通信 xff0c 因为所有计算机都需要遵循同一种网络协议 网络编程中有很多协议 xff0c 如 xff0c TCP协议 UDP协议
  • 数据结构之二叉树 Python实现

    树 树是一种非线性的数据结构 树 xff0c 它是若干结点的集合 xff0c 是由唯一的根和若个棵互不相交的子树组成的 其中 xff0c 每一棵子树又是一棵树 xff0c 也是由唯一的根结点和若干棵互不相交的子树组成的 由此可知 xff0c
  • 《奔跑吧Linux内核(第二版)》第四章笔记

    内核配置 内核配置工具常见的有 xff1a make config make oldconfig make menuconfig 内核配置工具最终会在Linux内核源码的根目录下生成一个隐藏文件 config文件 xff0c 这个文件包含了
  • GDB+QEMU调试Linux内核

    1 使用qemu创建虚拟机 使用qemu创建ARM64架构虚拟机可以参考我的另一篇博客 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08 二 xff09 2 安装gdb multiarch工具包 span
  • centos7 HA

    本文以两台机器实现双集热备高可用集群 xff0c 主机名node1的IP为192 168 122 168 xff0c 主机名node2的IP为192 168 122 169 一 安装集群软件 必须软件pcs xff0c pacemaker
  • 《奔跑吧Linux内核(第二版)》第五章笔记

    Linux内核采用宏内核架构 xff0c 即操作系统的大部分功能都在内核中实现 xff0c 比如进程管理 内存管理 进程调度 设备管理等 xff0c 并且都在特权模式下 xff08 内核空间 xff09 运行 而与之相反的另一种流行的架构是
  • 交叉编译内核模块

    本实验在x86环境中交叉编译ARM64架构模块 xff0c 然后qemu启动ARM64架构虚拟机 xff0c 加载该模块运行 1 创建ARM64虚拟机 详见 xff1a Ubuntu18 04使用qemu搭建ARM64架构虚拟机 xff08
  • Linux内核模块相互调用

    编写一个内核模块A xff0c 通过导出模块符号的方式来实现接口函数 编写另一个内核模块B xff0c 调用内核模块A暴露出来的接口函数 1 源文件 内核模块A xff08 test A c xff09 span class token m
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x
  • LXC容器相关论文笔记

    段赫 基于LXC容器资源优化的研究与实现 2016 一 绪论 容器虚拟化技术 传统虚拟化技术 xff0c 实现一个虚拟机就意味着需要消耗了硬件资源来在底层系统上虚拟一个新的操作系统 xff0c 所以除了传统模拟硬件的虚拟化技术 xff0c
  • fork和clone系统调用小实验

    实验一 xff1a 使用fork 函数创建一个子进程 xff0c 然后在父进程和子进程中分别使用printf语句来判断谁是父进程和子进程 fork 函数被调用后会立即创建一个子进程 xff0c 子进程和父进程同时独立运行互不干扰 返回值 x
  • 【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor

    背景 以往对多核实时操作系统的研究主要集中在多核处理器上任务集的可调度性和响应时间分析 同时 xff0c 许多研究人员声称 xff0c 在不久的将来 xff0c 高端嵌入式系统还将包括高性能并行应用程序 xff0c 以支持复杂的任务 xff
  • 树莓派4B内核打RT-preempt实时补丁的实现

    硬件环境 xff1a 树莓派4B 操作系统 xff1a 树莓派版Ubuntu server 20 04 LTS xff08 64bit xff09 1 依赖环境的安装 运行如下命令 xff1a span class token functi
  • RT-Preempt笔记

    基于Zynq平台的Linux实时性研究及在数据采集中的应用 马啸 嵌入式实时系统研究现状 实时操作系统专门用于在时间约束条件下运行时间关键的应用程序 用于操作处理实时任务所需的最坏情况执行时间 xff08 Worst Case Execut
  • Mac上vmware fusion装的ubuntu不能与主机复制粘贴的问题

    解决方法一 xff1a 安装vmware tools 依次点击 xff1a 虚拟机 gt 安装vmware tools 会在ubuntu桌面上出现vmware tools xff0c 双击打开 解压tar gz包 xff0c 执行解压命令t
  • ceph的一些优化

    最近一直在忙着搞Ceph存储的优化和测试 xff0c 看了各种资料 xff0c 但是好像没有一篇文章把其中的方法论交代清楚 xff0c 所以呢想在这里进行一下总结 xff0c 很多内容并不是我原创 xff0c 只是做一个总结 如果其中有任何
  • Ubuntu 20.04使用qemu搭建ARM64 Linux系统

    1 安装所需依赖 span class token function sudo span span class token function apt get span span class token function install sp
  • GCC 编译选项总结

    c 只激活预处理 编译 和汇编 也就是他只把程序做成obj文件 例子用法 gcc span class token operator span c hello span class token punctuation span c 他将生成
  • 常见排序算法 Python实现

    冒泡排序 span class token keyword def span span class token function bubbleSort span span class token punctuation span lst s
  • GCC 编译优化等级

    参考资料 xff1a Using the GNU Compiler Collection 打开优化标志会使编译器尝试以牺牲编译时间和调试程序的能力为代价来提高性能和 或代码大小 根据目标和 GCC 的配置方式 xff0c 在每个 O 级别启