添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

gcc 、 g++分别是gnu的c & c++编译器 。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。

GCC:  the GNU Compiler Collection

GNU 编译器集合包括 C、C++、Objective-C、Fortran、Ada、Go 和 D 的前端,以及这些语言的库(libstdc++,...)。 GCC 最初是作为 GNU 操作系统的编译器编写的。 GNU 系统被开发为 100% 自由软件,自由是指它尊重用户的自由。

前篇已经分析过了,gcc/g++在执行编译工作的时候,总共有4个步骤

  • 预处理,生成.i的文件;
  • 将预处理后的文件转换成汇编语言,生成文件.s
  • 将汇编代码变为目标代码(机器代码)生成.o的文件
  • 链接目标代码,生成可执行程序
  • gcc 与 g++ 区别

  • gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别。gcc 指令也为用户提供了“手动指定代表编译方式”的接口,即使用 -x 选项
  • xxx.c:默认以编译 C 语言程序的方式编译此文件;
  • xxx.cpp:默认以编译 C++ 程序的方式编译此文件。
  • xxx.m:默认以编译 Objective-C 程序的方式编译此文件;
  • xxx.go:默认以编译 Go 语言程序的方式编译此文件;
  • g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。
  • gcc 命令的常用选项

    选项解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 -DMACRO 以字符串"1"定义 MACRO 宏。 -DMACRO=DEFN 以字符串"DEFN"定义 MACRO 宏。 生成调试信息。GNU 调试器可利用该信息。 -ggdb 此选项将尽可能的生成 gdb 的可以使用的调试信息。 -gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息。 -gstabs+ 此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息。 -IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 -LDIRECTORY 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个DIRECTORY就是目录的名称。 -lLIBRARY 连接时搜索指定的函数库LIBRARY。 -static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行。 -share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。 -o <文件> 生成指定的输出文件。用在生成可执行文件时。 不进行优化处理。 -O 或 -O1 优化生成代码。 进一步优化。 比 -O2 更进一步优化,包括 inline 函数。 -shared 生成共享目标文件。通常用在建立共享库时。 -static 禁止使用共享连接。 -UMACRO 取消对 MACRO 宏的定义。 不生成任何警告信息。 -Wall 生成所有警告信息。 -pass-exit-codes 以最高错误代码退出某个阶段。 --help 显示此信息。 --target-help 显示目标特定的命令行选项。 --help=`{common optimizers --version 显示编译器版本信息。 -dumpspecs 显示所有内置规格字符串。 -dumpversion 显示编译器的版本。 -dumpmachine 显示编译器的目标处理器。 -print-search-dirs 显示编译器搜索路径中的目录。 -print-libgcc-file-name 显示编译器配套库的名称。 -print-file-name= 显示库的完整路径。 -print-prog-name= 显示编译器组件的完整路径。 -print-multiarch 显示目标的规范化 GNU 三元组,用作库路径中的组件。 -print-multi-directory 显示 libgcc 版本的根目录。 -print-multi-lib 显示命令行选项与多个库搜索目录。 -print-multi-os-directory 显示操作系统库的相对路径。 -print-sysroot 显示目标库目录。 -print-sysroot-headers-suffix 显示用于查找标头的 sysroot 后缀。 -Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器。 -Wp,<选项> 将逗号分隔的 <选项> 传递到预处理器。 -Wl,<选项> 将逗号分隔的 <选项> 传递给链接器。 -Xassembler 将传递给汇编器。 -Xpreprocessor 将传递给预处理器。 -Xlinker 将传递给链接器。 -save-temps 不要删除中间文件。 -save-temps= 不删除中间文件。 -no-canonical-prefixes 构建相对路径时不要规范化路径其他 gcc 组件的前缀。 -pipe 使用管道而不是中间文件。 -time 每个子进程的执行时间。 -specs=<文件> 使用 <文件> 的内容覆盖内置规范。 -std=<标准> 假设输入源适用于<标准>。 --sysroot= 使用作为标头的根目录和库路径。 -B <目录> 将<目录> 添加到编译器的搜索路径。 显示编译器调用的程序。 与 -v 类似,但引用了选项并且不执行命令。 仅预处理; 不要编译、汇编或链接。 只编译; 不要组装或链接。 编译和汇编,但不链接。 创建动态链接位置独立可执行的。 -shared 创建共享库。 -x <语言> 指定以下输入文件的语言。
    允许的语言包括: c c++ 汇编语言 none。'none' 表示恢复为默认行为根据文件扩展名猜测语言。 -include file 包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用 **#include**。 -imacros file 将 file 文件的宏, 扩展到 gcc/g++ 的输入文件, 宏定义本身并不出现在输入文件中。 -traditional 试图让编译器支持传统的C语言特性。 -funsigned-char
    -fno-signed-char
    -fsigned-char
    -fno-unsigned-char 对char类型进行设置,决定将char类型设置成
    unsigned char(前两个参数)
    signed char(后两个参数)

    注意: 以 -g、-f、-m、-O、-W 或 --param 开头的选项会自动传递到 gcc 调用的各个子进程。 为了将其他选项传递给这些进程,必须使用 -W选项。

    编译优化选项

    在没有任何优化选项的情况下,编译器的 目标 是降低编译成本并使调试产生预期结果。

    语句是独立的:如果通过语句之间的断点停止程序,则可以为任何变量分配新值或将程序计数器更改为函数中的任何其他语句,并准确获得期望从源代码中获得的结果。

    打开优化标志使编译器尝试提高性能和/或代码大小,但代价是编译时间和可能的调试程序的能力。

    编译器根据其对程序的了解来执行优化。 使用 -funit-at-a-time 标志将允许编译器在编译函数时考虑从文件中后面的函数获得的信息。 一次将多个文件编译为单个输出文件(并使用 -funit-at-a-time)将允许编译器在编译每个文件时使用从所有文件获得的信息。

    并非所有优化都直接由标志控制。 仅列出具有标志的优化。

    -O 优化

    -O1优化

    对于大型函数来说,优化编译会花费更多的时间和更多的内存。

    使用 -O, 编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。

    -O 打开以下优化标志:

        -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-conversion
        -fif-conversion2
        -finline-functions-called-once
        -fipa-modref
        -fipa-profile
        -fipa-pure-const
        -fipa-reference
        -fipa-reference-addressable
        -fmerge-constants
        -fmove-loop-invariants
        -fmove-loop-stores
        -fomit-frame-pointer
        -freorder-blocks
        -fshrink-wrap
        -fshrink-wrap-separate
        -fsplit-wide-types
        -fssa-backprop
        -fssa-phiopt
        -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-pta
        -ftree-scev-cprop
        -ftree-sink
        -ftree-slsr
        -ftree-sra
        -ftree-ter
        -funit-at-a-time

    -O 还会在机器上打开 -fomit-frame-pointer ,这样做不会干扰调试。

    进一步优化。 GCC 执行几乎所有支持的不涉及空间速度权衡的优化

    当指定 -O2 时, 编译器不会执行循环展开或函数内联。

    与 -O 相比,此选项 增加了编译时间和生成代码的性能。 -O2 打开-O 指定的所有优化标志。 它还打开以下优化标志:

        -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

    请注意 -fgcse 下有关在使用计算 goto 的程序上调用 -O2 的警告。

    -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-strides

    不优化。 这是默认设置。

    优化尺寸 。 -Os 启用通常不会增加代码大小的所有 -O2 优化。 它还执行旨在减少代码大小的进一步优化。

    -Os 禁用以下优化标志:

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

    如果使用多个 -O 选项,无论带或不带级别编号,最后一个此类选项都是有效的。

    -fflag 形式的选项指定与机器无关的标志。 大多数标志都有正面和负面的形式; -ffoo 的否定形式是 -fno-foo。 下表中仅列出了一种表单 - 通常会使用的一种。 可以通过删除“no-”或添加它来找出另一种形式。

    -Ofast

    无视严格的标准合规性。 -Ofast 启用所有 -O3 优化。

    它还可以实现并非对所有符合标准都有效的优化程式。

    它打开 -ffast-math、-fallow-store-data-races 和176 Using the GNU Compiler Collection (GCC) Fortran 特定的 -fstack-arrays,除非指定 -fmax-stack-var-size,和-fno-protect-parens。 它关闭-fsemantic-interposition。

    优化调试体验 。 -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 的行为与 -Os 类似,包括启用大多数 -O2 优化。

    -O 选项控制特定的优化

    它们要么由 -O 选项激活,要么与 -O 选项相关。 在极少数情况下,当需要对要执行的优化进行“微调”时,可以使用以下标志。

    -fno-defer-pop

    对于必须在函数调用后弹出参数的机器,请始终弹出每个函数返回后立即传递参数。 在 -O1 及更高级别,-fdeferpop 是默认值; 这允许编译器让参数累积在堆栈多个函数调用并一次将它们全部弹出。

    -fforward-propagate

    在 RTL 上执行前向传播传递。 该通行证试图将两者结合起来说明并检查结果是否可以简化。 如果循环展开处于活动状态,执行两遍,第二遍在循环展开后安排。

    默认情况下,此选项在优化级别 -O1、-O2、-O3、-Os 下启用。

    -ffp-contract=style

    -ffp-contract=off 禁用浮点表达式收缩。

    -ffpcontract=fast 启用浮点表达式收缩,例如形成融合乘加运算(如果目标本身支持它们)。

    -ffp-contract=on 在允许的情况下启用浮点表达式收缩语言标准。 目前尚未实施并平等对待改为-ffp-contract=off。

    默认值为-ffp-contract=fast。

    -fomit-frame-pointer

    在不需要的函数中省略帧指针。 这样就避免了保存、设置和恢复帧指针的指令; 在许多目标上,它还提供了一个额外的寄存器。

    在某些目标上,此标志无效,因为标准调用序列始终使用帧指针,因此不能省略。 请注意,-fno-omit-frame-pointer 并不保证在所有函数中都使用帧指针。 一些目标总是在叶函数中省略帧指针。

    默认情况下在 -O1 及更高版本启用。

    -foptimize-sibling-calls

    优化同级和尾递归调用。

    在-O2、-O3、-Os 级别启用。

    -fno-inline

    不要注意 inline 关键字。 通常,此选项用于防止编译器扩展任何内联函数。 请注意,如果不进行优化,则无法内联扩展任何函数。

    -finline-functions

    将所有简单函数集成到其调用者中。

    编译器启发式地决定哪些函数足够简单,值得以这种方式集成。

    如果对给定函数的所有调用都被集成,并且该函数被声明为静态,则该函数通常不会以其本身的形式输出为汇编代码。

    在-O3 级别启用。

    -finline-limit=n

    默认情况下,GCC 限制可以内联的函数的大小。 此标志允许控制显式标记为内联的函数的此限制(即,用 inline 关键字标记或在 c++ 中的类定义中定义)。 n 是可以内联的伪指令数量(不包括参数处理)的函数的大小。 n 的默认值为 600。增加此值可能会导致更多内联代码,但代价是编译时间和内存消耗。 减少通常会使编译速度更快,并且内联的代码更少(这可能意味着程序速度更慢)。 此选项对于大量使用内联的程序特别有用,例如基于 C++ 递归模板的程序。

    内联实际上是由许多参数控制的,可以使用 --param name=value 单独指定这些参数。 -finline-limit=n 选项设置其中一些参数,如下所示:

    max-inline-insns-single

    设置为n/2。

    max-inline-insns-auto

    设置为n/2。

    min-inline-insns

    设置为 130 或 n/4,以较小者为准。

    max-inline-insns-rtl

    被设置为n。

    请参阅下面有关控制内联的各个参数的文档。

    注意:在这个特定的上下文中,伪指令表示函数大小的抽象测量。 它绝不代表汇编指令的计数,因此其确切含义可能会因一个版本而异。

    -fkeep-inline-functions

    即使对给定函数的所有调用都已集成,并且该函数被声明为静态,仍然会输出该函数的单独运行时可调用版本。 此开关不影响外部内联函数。

    -fkeep-static-consts

    当优化未打开时,发出声明为 static const 的变量,即使未引用这些变量。

    GCC 默认启用此选项。 如果要强制编译器检查变量是否被引用,无论优化是否打开,请使用 -fno-keep-static-consts 选项。

    -fmerge-constants

    尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。

    如果汇编器和链接器支持,则此选项是优化编译的默认选项。 使用 -fno-merge-constants 来抑制此行为。

    在-O、-O2、-O3、-Os 级别启用。

    -fmerge-all-constants

    尝试合并相同的常量和相同的变量。

    此选项意味着 -fmerge-constants。

    除了 -fmerge-constants 之外,还考虑了例如 甚至是常量初始化数组或具有整型或浮点类型的初始化常量变量。

    C 或 C++ 等语言要求每个非自动变量具有不同的位置,因此使用此选项将导致不合格的行为。

    -fnew-ra

    使用图形着色寄存器分配器。 目前此选项仅用于测试。 用户不应指定此选项,因为它尚未准备好用于生产使用。

    -fno-branch-count-reg

    不要在计数寄存器上使用“递减和分支”指令,而是生成一系列指令来递减寄存器,将其与零进行比较,然后根据结果进行分支。 此选项仅对支持此类指令的体系结构有意义,其中包括 x86、PowerPC、IA-64 和 S/390。

    默认为 -fbranch-count-reg,当启用 -fstrength-reduce 时启用。

    -fno-function-cse

    不要将函数地址放入寄存器中; 使调用常量函数的每条指令显式包含该函数的地址。

    此选项会导致代码效率较低,但一些改变汇编器输出的奇怪黑客可能会因不使用此选项时执行的优化而感到困惑。

    默认为-ffunction-cse

    -fno-zero-initialized-in-bss

    如果目标支持 BSS 部分,GCC 默认情况下会将初始化为零的变量放入 BSS 中。 这可以节省结果代码的空间。

    此选项会关闭此行为,因为某些程序明确依赖于进入数据部分的变量。

    例如,以便生成的可执行文件可以找到该部分的开头和/或基于此做出假设。

    默认值为 -fzero-initialized-in-bss。

    -fstrength-reduce

    执行循环强度降低和迭代变量消除的优化。

    在-O2、-O3、-Os 级别启用。

    -fthread-jumps

    执行优化,检查跳转是否分支到找到第一个比较所包含的另一个比较的位置。

    如果是,则将第一个分支重定向到第二个分支的目的地或紧随其后的点,具体取决于已知条件是真还是假。

    在-O、-O2、-O3、-Os 级别启用。

    -fcse-follow-jumps

    在公共子表达式消除中,当任何其他路径都没有到达跳转目标时,扫描跳转指令。

    例如,当CSE遇到带有else子句的if语句时,当测试的条件为假时,CSE将跟随跳转。

    在-O2、-O3、-Os 级别启用。

    -fcse-skip-blocks 这与 -fcse-follow-jumps 类似,但会导致 CSE 跟随有条件跳过块的跳转。

    当 CSE 遇到没有 else 子句的简单 if 语句时,-fcse-skip-blocks 会导致 CSE 跟随 if 主体周围的跳转。

    在-O2、-O3、-Os 级别启用。

    -frerun-cse-after-loop

    执行循环优化后重新运行公共子表达式消除。

    在-O2、-O3、-Os 级别启用。

    -frerun-loop-opt

    运行循环优化器两次。

    在-O2、-O3、-Os 级别启用。

    -fgcse

    执行全局公共子表达式消除过程。 此过程还执行全局常量和复制传播。 注意:使用计算型 goto(GCC 扩展)编译程序时,如果通过在命令行中添加 -fno-gcse 来禁用全局公共子表达式消除过程,则可能会获得更好的运行时性能。

    在-O2、-O3、-Os 级别启用。

    -fgcse-lm

    当启用 -fgcse-lm 时,全局公共子表达式消除将尝试将仅被存储杀死的负载移动到自身中。 这允许将包含加载/存储序列的循环更改为循环外的加载以及循环内的复制/存储。 启用 gcse 时默认启用。

    -fgcse-sm

    启用 -fgcse-sm 时,会在全局公共子表达式消除后运行存储运动传递。 此过程将尝试将商店移出循环。 当与 -fgcse-lm 结合使用时,包含加载/存储序列的循环可以更改为循环之前加载和循环之后存储。 启用 gcse 时默认启用。

    -fgcse-las

    启用 -fgcse-las 时,全局公共子表达式消除过程会消除存储到同一内存位置后出现的冗余负载(部分冗余和完全冗余)。

    启用 gcse 时默认启用。

    -floop-optimize

    执行循环优化:将常量表达式移出循环,简化退出测试条件,还可以选择进行强度降低和循环展开。 在-O、-O2、-O3、-Os 级别启用。

    -fcrossjumping

    进行交叉跳跃变换。 此转换统一了等效代码并节省了代码大小。 生成的代码可能会或可能不会比没有交叉跳转的情况更好。 在-O、-O2、-O3、-Os 级别启用。

    -fif-conversion

    尝试将条件跳转转换为无分支的等效跳转。 这包括使用条件移动、最小值、最大值、设置标志和绝对指令,以及一些可通过标准算术实现的技巧。 在可用的芯片上条件执行的使用由 if-conversion2 控制。

    在-O、-O2、-O3、-Os 级别启用。

    -fif-conversion2

    使用条件执行(如果可用)将条件跳转转换为无分支等效项。 在-O、-O2、-O3、-Os 级别启用。

    -fdelete-null-pointer-checks

    使用全局数据流分析来识别并消除对空指针的无用检查。 编译器假定取消引用空指针会停止程序。 如果在取消引用指针后对其进行检查,则该指针不能为空。 在某些环境中,这种假设并不成立,程序可以安全地取消引用空指针。 使用 -fno-delete-null-pointer-checks 对依赖于该行为的程序禁用此优化。

    在-O2、-O3、-Os 级别启用。

    -fexpensive-optimizations

    执行一些相对昂贵的小优化。 在-O2、-O3、-Os 级别启用。

    -foptimize-register-move

    -fregmove

    尝试重新分配移动指令中的寄存器编号以及作为其他简单指令的操作数,以最大化寄存器绑定数量。 这对于具有两个操作数指令的机器特别有用。 注意 -fregmove 和 -foptimize-register-move 是相同的优化。

    在-O2、-O3、-Os 级别启用。

    -fdelayed-branch

    如果目标机器支持,请尝试重新排序指令以利用延迟分支指令后可用的指令槽。 在-O、-O2、-O3、-Os 级别启用。

    -fschedule-insns

    如果目标机器支持,请尝试重新排序指令以消除由于所需数据不可用而导致的执行停顿。 这可以通过允许发出其他指令直到需要加载或浮点指令的结果来帮助具有缓慢浮点或内存加载指令的机器。 在-O2、-O3、-Os 级别启用。

    -fschedule-insns2

    与 -fschedule-insns 类似,但在寄存器分配完成后请求额外的指令调度过程。 这对于寄存器数量相对较少且内存加载指令需要多个周期的机器尤其有用。 在-O2、-O3、-Os 级别启用。

    -fno-sched-interblock

    不要跨基本块安排指令。 在寄存器分配之前进行调度时,即使用 -fschedule-insns 或 -O2 或更高级别时,通常默认启用此功能。

    -fno-sched-spec

    不允许非加载指令的推测性动作。 在寄存器分配之前进行调度时,即使用 -fschedule-insns 或 -O2 或更高级别时,通常默认启用此功能。

    -fsched-spec-load

    允许某些加载指令的推测性运动。 这仅在寄存器分配之前进行调度时才有意义,即使用 -fschedule-insns 或 -O2 或更高版本。

    -fsched-spec-load-dangerous

    允许更多加载指令的推测运动。 这仅在寄存器分配之前进行调度时才有意义,即使用 -fschedule-insns 或 -O2 或更高版本。

    -fsched-stalled-insns=n

    定义在第二次调度过程中可以将多少个 insn(如果有)提前从停滞的 insn 队列移动到就绪列表中。

    -fsched-stalled-insns-dep=n

    定义将检查多少个 insn 组(周期)对停顿 insn 的依赖性,该停顿 insn 是从停顿 insn 队列中提前删除的候选者。 仅在第二次调度期间有效,并且仅当使用 -fsched-stalled-insns 并且其值不为零时有效。

    -fsched2-use-superblocks

    当寄存器分配后进行调度时,一定要使用超级块调度算法。 超级块调度允许跨越基本块边界的运动,从而产生更快的调度。 此选项是实验性的,因为并非 GCC 使用的所有机器描述都足够接近地对 CPU 进行建模,以避免算法产生不可靠的结果。

    这仅在寄存器分配后进行调度时才有意义,即使用 -fschedule-insns2 或 -O2 或更高版本。

    -fsched2-use-traces

    在寄存器分配后进行调度时使用 -fsched2-use-superblocks 算法,并另外执行代码复制,以便使用跟踪器通道增加超级块的大小。 有关跟踪形成的详细信息,请参阅 -ftracer。 这种模式应该会产生更快但更长的程序。 此外,如果没有 -fbranch-probabilities,构建的轨迹可能与现实不符并损害性能。 这仅在寄存器分配后进行调度时才有意义,即使用 -fschedule-insns2 或 -O2 或更高版本。

    -fcaller-saves

    通过发出额外的指令来保存和恢复此类调用周围的寄存器,从而可以在将被函数调用破坏的寄存器中分配值。 仅当这种分配似乎能产生比其他方式生成的代码更好的代码时,才会进行这种分配。 在某些机器上,此选项始终默认启用,通常是那些没有调用保留寄存器可供使用的机器。

    在-O2、-O3、-Os 级别启用。

    -fno-branch-count-reg

    强制将循环中的所有不变计算移至循环之外。

    -freduce-all-givs

    强制降低循环中的所有一般归纳变量的强度。 注意:编译用 Fortran 编写的程序时,使用优化器时默认启用 -fmove-all-movables 和 -freduce-all-givs。

    这些选项可能会生成更好或更差的代码; 结果高度依赖于源代码中的循环结构。

    一旦这两个选项有助于确定改进循环优化的各种方法的有效性,它们就会在有一天被删除。

    -fno-peephole

    -fno-peephole2

    禁用任何特定于机器的窥视孔优化。 -fno-peephole 和 -fno-peephole2 之间的区别在于它们在编译器中的实现方式; 有些目标使用其中之一,有些目标使用另一个,还有一些目标两者都使用。 -fpeephole 默认启用。 -fpeephole2 在 -O2、-O3、-Os 级别启用。

    -fno-guess-branch-probability

    不要使用随机模型猜测分支概率。 有时,当分析反馈(-fprofile-arcs)或“__builtin_expect”都无法提供分支概率时,GCC 会选择使用随机模型来猜测分支概率。 这意味着编译器在同一程序上的不同运行可能会产生不同的目标代码。

    在硬实时系统中,人们不希望编译器的不同运行产生具有不同行为的代码; 最大限度地减少非决定论至关重要。 此开关允许用户减少不确定性,但可能会以较差的优化为代价。

    默认值为 -O、-O2、-O3、-Os 级别的 -fguess-branch-probability。

    -freorder-blocks

    对编译函数中的基本块重新排序,以减少采用的分支数量并提高代码局部性。 在-O2、-O3 级别启用。

    -freorder-functions

    对编译函数中的基本块重新排序,以减少采用的分支数量并提高代码局部性。 这是通过对最常执行的函数使用特殊的小节 .text.hot 和对不太可能执行的函数使用 .text.unlikely 来实现的。 重新排序是由链接器完成的,因此目标文件格式必须支持命名节,并且链接器必须以合理的方式放置它们。

    此外,必须提供个人资料反馈才能使此选项有效。 有关详细信息,请参阅 -fprofile-arcs。

    在-O2、-O3、-Os 级别启用。

    -fstrict-aliasing

    允许编译器采用适用于正在编译的语言的最严格的别名规则。 对于 C(和 C++),这会根据表达式的类型激活优化。 特别是,假定一种类型的对象永远不会与不同类型的对象驻留在同一地址,除非类型几乎相同。

    例如,unsigned int 可以为 int 起别名,但不能为 void* 或 double 起别名。 字符类型可以是任何其他类型的别名。 特别注意这样的代码:

      union a_union {
        int i;
        double d;
      };

      int f() {
        a_union t;
        t.d = 3.0;
        return t.i;
      }

    联合体成员“类型双关语”是很常见的。 即使使用 -fstrict-aliasing,也允许类型双关,前提是通过联合类型访问内存。 因此,上面的代码将按预期工作。 然而,这段代码可能不会:

      int f() {
        a_union t;
        int* ip;
        t.d = 3.0;
        ip = &t.i;
        return *ip;
      }

    每种希望执行特定于语言的别名分析的语言都应该定义一个函数,该函数在给定树节点的情况下计算该节点的别名集。 不同别名集中的节点不允许使用别名。 有关示例,请参见 C 前端函数 c_get_alias_set。

    在-O2、-O3、-Os 级别启用。

    -falign-functions

    -falign-functions=n

    将函数的开头与下一个大于 n 的 2 的幂对齐,最多跳过 n 个字节。 例如,-falign-functions=32 将函数与下一个 32 字节边界对齐,但 -falign-functions=24 仅当可以通过跳过 23 个字节或更少字节来完成时,才会与下一个 32 字节边界对齐。 -fno-align-functions 和 -falign-functions=1 是等效的,意味着函数不会对齐。

    某些汇编器仅在 n 为 2 的幂时支持此标志; 在这种情况下,它会被四舍五入。

    如果 n 未指定或为零,则使用与机器相关的默认值。

    在-O2、-O3 级别启用。

    -falign-labels

    -falign-labels=n

    将所有分支目标对齐到 2 的幂边界,像 -falign-functions 一样跳过最多 n 个字节。 此选项很容易使代码变慢,因为它必须在通常的代码流程中达到分支目标时插入虚拟操作。 -fno-align-labels 和 -falign-labels=1 是等效的,意味着标签不会对齐。

    如果 -falign-loops 或 -falign-jumps 适用并且大于此值,则使用它们的值。

    如果 n 未指定或为零,则使用与机器相关的默认值,该默认值很可能为“1”,表示不对齐。

    在-O2、-O3 级别启用。

    -falign-loops

    -falign-loops=n

    将循环对齐到 2 的幂边界,像 -falign-functions 一样跳过最多 n 个字节。 希望循环将执行多次,这将弥补虚拟操作的任何执行。 -fno-align-loops 和 -falign-loops=1 是等效的,意味着循环不会对齐。

    如果 n 未指定或为零,则使用与机器相关的默认值。

    -falign-jumps

    -falign-jumps=n

    将分支目标与 2 的幂边界对齐,对于只能通过跳转到达目标的分支目标,最多跳过 n 个字节,如 -falign-functions。 在这种情况下,不需要执行伪操作。 -fno-align-jumps 和 -falign-jumps=1 是等效的,意味着循环不会对齐。

    如果 n 未指定或为零,则使用与机器相关的默认值。

    在-O2、-O3 级别启用。

    -frename-registers

    尝试通过利用寄存器分配后剩余的寄存器来避免调度代码中的错误依赖关系。 这种优化最有利于具有大量寄存器的处理器。 然而,它可能使调试变得不可能,因为变量将不再保留在“主寄存器”中。

    -fweb

    构建通常用于寄存器分配目的的网络,并为每个网络分配单独的伪寄存器。 这允许寄存器分配通道直接在伪上操作,而且还增强了其他几个优化通道,例如 CSE、循环优化器和琐碎死代码删除器。 然而,它可能使调试变得不可能,因为变量将不再保留在“主寄存器”中。 在-O3级别启用。

    -fno-cprop-registers

    在寄存器分配和寄存器分配后指令拆分之后,我们执行复制传播过程以尝试减少调度依赖性并偶尔消除复制。 在-O、-O2、-O3、-Os 级别禁用。

    -fprofile-generate

    启用通常用于检测应用程序的选项,以生成可用于以后通过基于配置文件反馈的优化进行重新编译的配置文件。 编译和链接程序时都必须使用 -fprofile-generate。 启用以下选项:-fprofile-arcs、-fprofile-values、-fvpt。

    -fprofile-use

    启用配置文件反馈定向优化,并且优化通常只有在配置文件反馈可用的情况下才有利可图。 启用以下选项:-fbranch-probabilities、-fvpt、-funroll-loops、-fpeel-loops、-ftracer。

    以下选项控制有关浮点运算的编译器行为。 这些选项在速度和正确性之间进行权衡。 所有这些都必须专门启用。

    -ffloat-store

    不要将浮点变量存储在寄存器中,并禁止其他可能更改浮点值是从寄存器还是内存中获取的选项。 此选项可防止在 68000 等机器上出现不需要的过高精度,其中浮动寄存器(68881 的)保持比双精度更高的精度。 x86 架构也是如此。 对于大多数程序来说,过高的精度只会带来好处,但也有少数程序依赖于 IEEE 浮点的精确定义。 在修改此类程序以将所有相关的中间计算存储到变量中之后,请对此类程序使用 -ffloat-store 。

    -ffast-math

    设置 -fno-math-errno、-funsafe-math-optimizations、 -fno-trapping-math、-ffinite-math-only、-fno-rounding-math 和 -fno-signaling-nans。 此选项导致定义预处理器宏 __FAST_MATH__。

    任何 -O 选项都不应打开此选项,因为它可能会导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。

    -fno-math-errno

    调用使用单条指令(例如 sqrt)执行的数学函数后,请勿设置 ERRNO。 依赖 IEEE 异常进行数学错误处理的程序可能希望使用此标志来提高速度,同时保持 IEEE 算术兼容性。 任何 -O 选项都不应打开此选项,因为它可能会导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。

    默认值为 -fmath-errno。

    -funsafe-math-optimizations

    允许对浮点算术进行优化,(a) 假设参数和结果有效,并且 (b) 可能违反 IEEE 或 ANSI 标准。 在链接时使用时,它可能包括更改默认 FPU 控制字或其他类似优化的库或启动文件。

    任何 -O 选项都不应打开此选项,因为它可能会导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。

    默认值为 -fno-unsafe-math-optimizations。

    -ffinite-math-only

    允许对假设参数和结果不是 NaN 或 +-Infs 的浮点算术进行优化。 任何 -O 选项都不应打开此选项,因为它可能导致依赖于 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。

    默认值为 -fno-finite-math-only。

    -fno-trapping-math

    假设浮点运算无法生成用户可见的陷阱来编译代码。 这些陷阱包括被零除、溢出、下溢、不精确结果和无效操作。 此选项意味着 -fno-signaling-nans。 例如,如果依赖于“不间断”IEEE 算法,设置此选项可能会允许更快的代码。

    任何 -O 选项都不应打开此选项,因为它可能会导致依赖于数学函数的 IEEE 或 ISO 规则/规范的精确实现的程序输出不正确。

    默认值为 -ftrapping-math。

    -frounding-math

    禁用假定默认浮点舍入行为的转换和优化。 对于所有浮点到整数的转换,这是舍入到零,对于所有其他算术截断,这是舍入到最接近的值。 对于动态更改 FP 舍入模式或可能以非默认舍入模式执行的程序,应指定此选项。 此选项禁用编译时浮点表达式的常量折叠(这可能会受到舍入模式的影响)以及在存在符号相关舍入模式时不安全的算术转换。 默认值为 -fno-rounding-math。

    此选项是实验性的,当前不能保证禁用所有受舍入模式影响的 GCC 优化。 GCC 的未来版本可能会使用 C99 的 FENV_ACCESS 编译指示对此设置提供更精细的控制。 此命令行选项将用于指定 FENV_ACCESS 的默认状态。

    -fsignaling-nans

    编译代码时假设 IEEE 信号 NaN 可能在浮点运算期间生成用户可见的陷阱。 设置此选项会禁用可能会更改信号 NaN 可见异常数量的优化。 此选项意味着 -ftrapping-math。 此选项导致定义预处理器宏 __SUPPORT_SNAN__。

    默认值为 -fno-signaling-nans。

    此选项是实验性的,目前不保证禁用所有影响信号 NaN 行为的 GCC 优化。

    -fsingle-precision-constant

    将浮点常量视为单精度常量,而不是将其隐式转换为双精度常量。 以下选项控制可以提高性能的优化,但任何 -O 选项都无法启用。 本节包含可能会产生损坏代码的实验选项。

    -fbranch-probabilities

    运行使用 -fprofile-arcs 编译的程序(请参阅调试程序或 gcc 的选项)后,可以使用 -fbranch-probabilities 再次编译它,以根据每个分支的执行次数来改进优化。 当使用 -fprofile-arcs 编译的程序退出时,它会将每个源文件的弧执行计数保存到名为 sourcename.gcda 的文件中。此数据文件中的信息非常依赖于生成的代码的结构,因此必须使用相同的源 两种编译的代码和相同的优化选项。

    使用 -fbranch-probabilities,GCC 在每个“JUMP_INSN”和“CALL_INSN”上放置一个“REG_BR_PROB”注释。 这些可用于改进优化。

    目前,它们仅用在一个地方:在 reorg.c 中,不是猜测分支主要采用哪条路径,而是使用“REG_BR_PROB”值来准确确定更频繁地采用哪条路径。

    -fprofile-values

    如果与 -fprofile-arcs 结合使用,它会添加代码,以便收集有关程序中表达式值的一些数据。 使用 -fbranch-probabilities,它会读回从表达式的分析值收集的数据,并将“REG_VALUE_PROFILE”注释添加到指令中,以便以后在优化中使用。

    -fvpt

    如果与 -fprofile-arcs 结合使用,它会指示编译器添加代码来收集有关表达式值的信息。 使用 -fbranch-probabilities,它会读回收集的数据并根据它们实际执行优化。 目前的优化包括使用有关分母值的知识来进行除法运算的专门化。

    -fnew-ra

    使用图形着色寄存器分配器。 目前此选项用于测试,因此我们有兴趣了解 -fnew-ra 的错误编译。

    -ftracer

    执行尾部复制以扩大超级块大小。 这种转换简化了函数的控制流程,使其他优化能够做得更好。

    -funit-at-a-time

    在开始生成代码之前解析整个编译单元。 这允许进行一些额外的优化,但会消耗更多内存。

    -funroll-loops

    展开循环,其迭代次数可以在编译时或进入循环时确定。

    -funroll-loops 意味着 -frerun-cse-after-loop。 它还打开完全循环剥离(即完全删除具有小常数迭代次数的循环)。 此选项会使代码变得更大,并且可能会或可能不会使其运行得更快。

    -funroll-all-loops

    展开所有循环,即使在进入循环时迭代次数不确定。 这通常会使程序运行得更慢。 -funroll-all-loops 意味着与 -funroll-loops 相同的选项。

    -fpeel-loops

    剥离循环,因为有足够的信息,它们不会滚动太多(来自配置文件反馈)。 它还打开完全循环剥离(即完全删除具有小常数迭代次数的循环)。

    -funswitch-loops

    将具有循环不变条件的分支移出循环,并在两个分支上重复循环(根据条件结果进行修改)。

    -fold-unroll-loops

    展开循环,其迭代次数可以在编译时或进入循环时确定,使用旧的循环展开器,其循环识别基于前端的注释。 -fold-unroll-loops 意味着 -fstrength-reduce 和 -frerun-cse-after-loop。 此选项会使代码变得更大,并且可能会或可能不会使其运行得更快。

    -fold-unroll-all-loops

    展开所有循环,即使在进入循环时迭代次数不确定。 这是使用旧的循环展开器完成的,其循环识别基于前端的注释。 这通常会使程序运行得更慢。 -fold-unroll-all-loops 意味着与 -fold-unroll-loops 相同的选项。

    -funswitch-loops

    将具有循环不变条件的分支移出循环,并在两个分支上重复循环(根据条件结果进行修改)。

    -funswitch-loops

    将具有循环不变条件的分支移出循环,并在两个分支上重复循环(根据条件结果进行修改)。

    -fprefetch-loop-arrays

    如果目标机器支持,则生成预取内存的指令,以提高访问大型数组的循环的性能。 在-O 级禁用。

    -ffunction-sections

    -fdata-sections

    如果目标支持任意部分,请将每个函数或数据项放入输出文件中自己的部分中。 函数的名称或数据项的名称决定了输出文件中的节的名称。

    在链接器可以执行优化以提高指令空间中引用局部性的系统上使用这些选项。 大多数使用 ELF 对象格式和运行 Solaris 2 的 SPARC 处理器的系统都具有具有此类优化的链接器。 AIX 将来可能会有这些优化。

    仅当这样做可以带来显着好处时才使用这些选项。 当指定这些选项时,汇编器和链接器将创建更大的目标文件和可执行文件,并且速度也会变慢。 如果指定此选项,将无法在所有系统上使用 gprof,并且如果同时指定此选项和 -g,则可能会出现调试问题。

    -fbranch-target-load-optimize

    在序言/结尾线程之前执行分支目标寄存器加载优化。 目标寄存器的使用通常只能在重新加载期间公开,因此将负载提升出循环并进行块间调度需要单独的优化过程。

    -fbranch-target-load-optimize2

    在序言/结尾线程之后执行分支目标寄存器加载优化。

    --param name=value

    在某些地方,GCC 使用各种常量来控制所完成的优化量。 例如,GCC 不会内联包含超过一定数量指令的函数。 可以使用 --param 选项在命令行上控制其中一些常量。 特定参数的名称和值的含义与编译器的内部结构相关,并且在未来的版本中可能会发生更改,恕不另行通知。

    在每种情况下,该值都是整数。 下表给出了允许的名称选择:

    max-crossjump-edges 最大交叉跳跃边缘

    交叉跳跃时考虑的最大传入边数。 -fcrossjumping 使用的算法在传入每个块的边数方面为 O(N^2)。 增加值意味着更积极的优化,使得编译时间增加,而可执行文件大小可能略有改善。

    max-delay-slot-insn-search 最大延迟时隙插入搜索

    寻找指令来填充延迟槽时要考虑的最大指令数。 如果搜索的指令多于这个任意数量,则填充延迟槽所节省的时间将是最小的,因此停止搜索。 增加值意味着更积极的优化,使编译时间增加,而可执行文件运行时间可能会略有改善。

    max-gcse-memory 最大延迟时隙实时搜索

    当尝试填充延迟槽时,搜索具有有效活动寄存器信息的块时要考虑的最大指令数。 增加这个任意选择的值意味着更积极的优化,增加编译时间。 当重写延迟槽代码以维护控制流图时,应删除此参数。

    max-gcse-memory

    为了执行全局公共子表达式消除优化而分配的大约最大内存量。 如果需要的内存多于指定的内存,则不会进行优化。

    max-gcse-passes

    GCSE 的最大通过次数。

    max-pending-list-length

    在刷新当前状态并重新开始之前,调度允许的挂起依赖项的最大数量。 具有很少分支或调用的大型函数可能会创建过大的列表,从而不必要地消耗内存和资源。

    max-inline-insns-single

    有几个参数控制 gcc 中使用的树内联器。 该数字设置树内联器将考虑进行内联的单个函数中的最大指令数(以 GCC 的内部表示形式计数)。 这仅影响内联声明的函数和类声明 (C++) 中实现的方法。 默认值为 500。

    max-inline-insns-auto

    当使用 -finline-functions(包含在 -O3 中)时,将研究许多编译器不会考虑内联的函数。 对于这些函数,与声明为内联的函数相比,可以应用不同的(更严格的)限制。 默认值为 100。

    large-function-insns

    指定非常大的函数的限制。 对于大于此限制的函数,内联受 --param large-function-growth 约束。 该参数主要用于避免后端使用的非线性算法导致极端的编译时间。 当不使用 -funit-at-a-time 时,该参数将被忽略。 默认值为 3000。

    large-function-growth

    指定由内联引起的大函数的最大增长百分比。 当不使用 -funit-at-a-time 时,该参数将被忽略。 默认值为 200。

    inline-unit-growth

    指定由内联引起的编译单元的最大总体增长。 当不使用 -funit-at-a-time 时,该参数将被忽略。 默认值为 150。

    max-inline-insns-rtl

    对于使用 RTL 内联的语言(这发生在树内联的后期),可以使用此参数设置 RTL 内联的最大允许大小(以 RTL 指令计算)。 默认值为 600。

    max-unrolled-insns

    如果展开循环,则循环应具有的最大指令数;如果展开循环,它确定循环代码展开的次数。

    max-average-unrolled-insns

    如果展开循环,则循环应具有的最大指令数取决于其执行概率,并且如果展开循环,则它确定循环代码展开的次数。

    max-unroll-times

    单个循环的最大展开次数。

    max-peeled-insns

    如果循环被剥离,则循环应具有的最大指令数,如果循环被剥离,则它确定循环代码被剥离的次数。

    max-peel-times

    单循环最大剥皮次数。

    max-completely-peeled-insns

    完全剥离循环的insn的最大数量。

    max-completely-peel-times

    适合完全剥离的循环的最大迭代次数。

    max-unswitch-insns

    未切换循环的最大 insn 数。

    max-unswitch-level

    单个循环中未切换的最大分支数。

    hot-bb-count-fraction

    在给定基本块需要被视为热的情况下,选择程序中基本块的最大重复次数的分数。

    hot-bb-frequency-fraction

    在给定基本块需要被视为热的情况下,选择函数中基本块的最大执行频率的分数

    tracer-dynamic-coverage 跟踪器动态覆盖

    tracer-dynamic-coverage-feedback 跟踪器动态覆盖反馈

    一旦覆盖了给定百分比的已执行指令,该值用于限制超级块的形成。 这限制了不必要的代码大小扩展。 仅当配置文件反馈可用时才使用跟踪器动态覆盖反馈。 真实的配置文件(与静态估计的配置文件相反)的平衡度要低得多,允许阈值更大。

    tracer-max-code-growth 跟踪器最大代码增长

    一旦代码增长达到给定百分比,就停止尾部重复。 这是一个相当做作的论点,因为大多数重复项将在稍后的交叉跳跃中被消除,因此它可能被设置为比所需的代码增长高得多的值。

    tracer-min-branch-ratio

    当最佳边缘的反向概率小于此阈值(以百分比表示)时,停止反向增长。

    tracer-min-branch-ratio 示踪最小分支比

    tracer-min-branch-ratio-feedback 示踪最小分支比反馈

    如果最佳边缘的概率确实低于此阈值,则停止向前增长。

    与跟踪器动态覆盖类似,存在两个值,一个用于编译配置文件反馈,另一个用于编译没有配置文件反馈。 为了使跟踪器有效,带有配置文件反馈的编译值需要更加保守(更高)。

    max-cse-path-length

    cse考虑的路径上基本块的最大数量。

    max-last-value-rtl

    最大大小测量为可记录在伪寄存器的组合器表达式中的 RTL 数量,作为该寄存器的最后已知值。 默认值为 10000。

    ggc-min-expand

    GCC 使用垃圾收集器来管理自己的内存分配。 此参数指定垃圾收集器堆在两次收集之间允许扩展的最小百分比。 调整此项可能会提高编译速度; 它对代码生成没有影响。

    默认值为 30% + 70% * (RAM/1GB),当 RAM >= 1GB 时上限为 100%。 如果 getrlimit 可用,则“RAM”的概念是实际 RAM、RLIMIT_RSS、RLIMIT_DATA 和 RLIMIT_AS 中最小的一个。 如果 GCC 无法计算特定平台上的 RAM,则使用 30% 的下限。 将此参数和 ggc-min-heapsize 设置为零会导致每次有机会进行完整收集。 这非常慢,但对于调试很有用。

    ggc-min-heapsize

    垃圾收集器开始收集垃圾之前堆的最小大小。 第一次收集发生在堆扩展超出 ggc-min-heapsize ggc-min-expand% 后。 同样,调整它可以提高编译速度,并且对代码生成没有影响。

    默认值为 RAM/8,下限为 4096(4 兆字节),上限为 131072(128 兆字节)。 如果 getrlimit 可用,则“RAM”的概念是实际 RAM、RLIMIT_RSS、RLIMIT_DATA 和 RLIMIT_AS 中最小的一个。 如果 GCC 无法计算特定平台上的 RAM,则使用下限。 将此参数设置得非常大会有效地禁用垃圾收集。 将此参数和 ggc-min-expand 设置为零会导致每次有机会进行完整收集。

    max-reload-search-insns

    指令重载的最大数量应向后查找等效寄存器。 增加值意味着更积极的优化,使编译时间增加,性能可能会稍好一些。 默认值为 100。

    max-cselib-memory-location

    cselib 应考虑的最大内存位置数。 增加值意味着更积极的优化,使编译时间增加,性能可能会稍好一些。 默认值为 500。

    reorder-blocks-duplicate 重新排序块重复

    reorder-blocks-duplicate-feedback 重新排序块重复反馈

    由基本块重新排序过程使用,以决定是使用无条件分支还是在其目标上复制代码。 当代码的估计大小小于该值乘以程序热点中无条件跳转的估计大小时,代码就会重复。

    仅当配置文件反馈可用时才使用 reorder-block-duplicate-feedback,并且可以将其设置为比 reorder-block-duplicate 更高的值,因为有关热点的信息更准确。

    Warnings

    警告选项含义 --all-warnings 与-Wall 相同。 请改用后一个选项。 --extra-warnings 与-Wextra 相同。 请改用后一个选项。 该开关已弃用; 使用 -Wextra 代替。 与-Wextra 相同。 -Wabi 警告使用符合 ABI 的编译器进行编译时将会发生的变化。 -Wabi-tag 如果子对象具有完整对象类型没有的 abi_tag 属性,则发出警告。 -Wabi= 警告当前 -fabi-version 和指定版本之间发生的变化。 -Wabsolute-value 对计算绝对值的标准函数的可疑调用发出警告。 -Waddress 警告内存地址的可疑使用。 -Waddress-of-packed-member 当获取结构或联合的打包成员的地址时发出警告。 -Waggregate-return 关于返回结构、联合或数组的警告。 -Waggressive-loop-optimizations 如果迭代次数恒定的循环触发未定义的行为,则发出警告。 -Waliasing 警告虚拟参数可能存在别名。 -Walign-commons 警告 COMMON 块的对齐情况。 -Waligned-new=`[none global -Wall 启用大多数警告消息。 -Walloc-size-larger-than= -Walloc-size-larger-than=<字节> 对尝试分配大于指定字节数的对象的分配函数的调用发出警告。 -Walloc-zero -Walloc-zero 对指定零字节的分配函数的调用发出警告。 -Walloca 警告任何使用 alloca 的情况。 -Walloca-larger-than= 对 alloca 的无限制使用以及其边界可能大于字节的 alloca 有限制使用发出警告。 -Wampersand 警告连续字符常量中缺少 & 符号。 -Wargument-mismatch 警告参数和参数之间的类型和等级不匹配。 -Warray-bounds 如果越界访问数组,则发出警告。 -Warray-bounds=<0,2> 如果越界访问数组,则发出警告。 -Warray-temporaries 警告创建临时数组。 -Wassign-intercept 每当垃圾收集器拦截 Objective-C 分配时发出警告。 -Wattribute-alias 警告具有别名属性的声明中的类型安全以及类似错误和不匹配。 与 -Wattribute-alias= 相同。 -Wattribute-alias=<0,2> 警告具有别名属性的声明中的类型安全以及类似错误和不匹配。 -Wattribute-warning 警告有关 __attribute__((warning)) 声明的使用。 -Wattributes 警告属性使用不当。 -Wbad-function-cast 警告将函数转换为不兼容的类型。 -Wbool-compare 警告布尔表达式与不同于 true/false 的整数值进行比较。 -Wbool-operation 对布尔表达式的某些操作发出警告。 -Wbuiltin-declaration-mismatch 当使用错误签名声明内置函数时发出警告。 -Wbuiltin-macro-redefine 当内置预处理器宏未定义或重新定义时发出警告。 -Wc++-compat 警告不属于 C 和 C++ 公共子集的 C 构造。 -Wc++0x-compat 与 -Wc++11-compat 相同。 请改用后一个选项。 -Wc++11-compat 对 ISO C++ 1998 和 ISO C++ 2011 之间含义不同的 C++ 结构发出警告。 -Wc++14-compat 对 ISO C++ 2011 和 ISO C++ 2014 之间含义不同的 C++ 结构发出警告。 -Wc++17-compat 对 ISO C++ 2014 和 ISO C++ 2017 之间含义不同的 C++ 结构发出警告。 -Wc++1z-compat 与 -Wc++17-compat 相同。 请改用后一个选项。 -Wc-binding-type 如果变量的类型可能无法与 C 互操作,则发出警告。 -Wc11-c2x-compat 警告 ISO C11 中不存在但 ISO C2X 中存在的功能。 -Wc90-c99-compat 警告 ISO C90 中不存在但 ISO C99 中存在的功能。 -Wc99-c11-compat 警告 ISO C99 中不存在但 ISO C11 中存在的功能。 -Wcannot-profile 当请求分析工具但无法应用于特定功能时发出警告。 -Wcast-align 警告有关增加对齐的指针转换。 -Wcast-align=strict 警告有关增加对齐的指针转换。 -Wcast-function-type 警告不兼容函数类型之间的转换。 -Wcast-qual 警告丢弃限定符的强制转换。 -Wcast-result 警告将产生空结果的强制转换。 -Wcatch-value 对非引用类型的 catch 处理程序发出警告。 与 -Wcatch-value= 相同。 -Wcatch-value=<0,3> 警告非引用类型的 catch 处理程序。 -Wchar-subscripts 警告类型为“char”的下标。 -Wcharacter-truncation 对截断的字符表达式发出警告。 -Wchkp 在 GCC 9 中已弃用。此开关无效。 -Wclass-conversion 当转换函数由于转换为的类型而永远不会被调用时发出警告。 -Wclass-memaccess 警告对类类型对象的不安全原始内存写入。 -Wclobbered 警告可能被“longjmp”或“vfork”更改的变量。 -Wcomment 对可能嵌套的块注释和跨越多个物理行的 C++ 注释发出警告。 -Wcomments -Wcomment 的同义词。 与 -Wcomment 相同。 -Wcompare-reals 警告涉及 REAL 或 COMPLEX 表达式的相等比较。 -Wconditionally-supported 警告有条件支持的构造。 -Wconversion 警告可能更改值的隐式类型转换。 -Wconversion-extra 对大多数隐式转换发出警告。 -Wconversion-null 警告将 NULL 从非指针类型转换为非指针类型。 -Wcoverage-mismatch 如果 -fprofile-use 中的配置文件不匹配,则发出警告。 -Wcpp 遇到 #warning 指令时发出警告。 -Wctor-dtor-privacy 当所有构造函数和析构函数都是私有的时发出警告。 -Wdangling-else 警告有关 dangling else 的情况。 -Wdate-time 警告 __TIME__ __DATE__ __TIMESTAMP__ 使用情况。 -Wdeclaration-after-statement 在语句后发现声明时发出警告。 -Wdelete-incomplete 删除指向不完整类型的指针时发出警告。 -Wdelete-non-virtual-dtor 警告使用非虚拟析构函数删除多态对象。 -Wdeprecated 如果使用了已弃用的编译器功能、类、方法或字段,则发出警告。 -Wdeprecated-copy 如果类具有用户提供的复制操作,则将隐式声明的复制操作标记为已弃用。 -Wdeprecated-copy-dtor 如果类具有用户提供的复制操作或析构函数,则将隐式声明的复制操作标记为已弃用。 -Wdeprecated-declarations 警告使用 __attribute__((deprecated)) 声明。 -Wdesignated-init 警告需要指定初始化器的结构的位置初始化。 -Wdisabled-optimization 当优化过程被禁用时发出警告。 -Wdiscarded-array-qualifiers 如果作为指针目标的数组上的限定符被丢弃,则发出警告。 -Wdiscarded-qualifiers 如果指针上的类型限定符被丢弃,则发出警告。 -Wdiv-byzero 警告编译时整数除以零。 -Wdo-subscript 警告 do 循环中可能存在不正确的下标。 -Wdouble-promotion 警告从“float”到“double”的隐式转换。 -Wduplicate-decl-specifier 当声明具有重复的 const、易失性、限制或 _Atomic 说明符时发出警告。 -Wduplicated-branches 警告 if-else 语句中的重复分支。 -Wduplicated-cond 警告 if-else-if 链中的重复条件。 -Weffc++ 警告违反有效 C++ 风格规则的情况。 -Wempty-body 警告 if 或 else 语句中的主体为空。 -Wendif-labels 警告 #else 和 #endif 之后的杂散标记。 -Wenum-compare 警告不同枚举类型的比较。 -Werror-implicit-function-declaration 此开关已弃用; 请改用 -Werror=implicit-function-declaration 。 与-Werror -Wexpansion-to-define 如果在#if 之外使用“define”,则发出警告。 -Wextra 打印额外的(可能不需要的)警告。 -Wextra-semi 警告类内函数定义后的分号。 -Wfloat-conversion 对导致浮点精度丢失的隐式类型转换发出警告。 -Wfloat-equal 如果测试浮点数是否相等则发出警告。 -Wformat 警告 printf/scanf/strftime/strfmon 格式字符串异常。 与-Wformat=相同。 -Wformat-contains-nul 警告包含 NUL 字节的格式字符串。 -Wformat-extra-args 如果向函数的格式字符串传递太多参数,则发出警告。 -Wformat-nonliteral 警告非文字的格式字符串。 -Wformat-overflow<0,2> 警告使用超出目标区域末尾的格式字符串的函数调用。 与 -Wformat-overflow=1 相同。 与-Wformat-相同 -Wformat-overflow=<0,2> 警告使用超出目标区域末尾的格式字符串的函数调用。 -Wformat-security 警告格式函数可能存在的安全问题。 -Wformat-signedness 警告格式函数的符号差异。 -Wformat-truncation 警告调用 snprintf 和截断输出的类似函数。 与 -Wformat-truncation=1 相同。 与 -Wformat-truncati -Wformat-truncation=<0,2> 对 snprintf 和截断输出的类似函数的调用发出警告。 -Wformat-y2k 警告 strftime 格式会产生 2 位数年份。 -Wformat-zero-length 警告零长度格式。 -Wformat=<0,2> 警告 printf/scanf/strftime/strfmon 格式字符串异常。 -Wframe-address 当不安全地使用 __builtin_frame_address __builtin_return_address 时发出警告。 -Wframe-larger-than=<字节大小> 如果函数的堆栈帧需要超过<字节大小>,则发出警告。 -Wfree-nonheap-object 尝试释放非堆对象时发出警告。 -Wfunction-elimination 警告函数调用消除。 -Whsa 当函数无法扩展到 HSAIL 时发出警告。 -Wif-not-aligned 当结构中的字段未对齐时发出警告。 -Wignored-attributes 每当属性被忽略时发出警告。 -Wignored-qualifiers 每当忽略类型限定符时发出警告。 -Wimplicit 警告隐式声明。 -Wimplicit-fallthrough 与 -Wimplicit-fallthrough= 相同。 请改用后一个选项。 -Wimplicit-fallthrough=<0,5> 当开关盒掉落时发出警告。 -Wimplicit-function-declaration 对隐式函数声明发出警告。 -Wimplicit-int 当声明未指定类型时发出警告。 -Wimplicit-interface 警告有关隐式接口的调用。 -Wimplicit-procedure 对未显式声明的调用过程发出警告。 -Wincompatible-pointer-types 当具有不兼容类型的指针之间存在转换时发出警告。 -Winherited-variadic-ctor 当基类具有可变构造函数时,警告 C++11 继承构造函数。 -Winit-list-lifetime 警告使用 std::initializer_list 可能导致悬空指针。 -Winit-self 对初始化为自身的变量发出警告。 -Winline 当内联函数无法内联时发出警告。 -Wint-conversion 警告整数到指针和指针到整数转换的不兼容。 -Wint-in-bool-context 对布尔上下文中的可疑整数表达式发出警告。 -Wint-to-pointer-cast 当从不同大小的整数强制转换为指针时发出警告。 -Winteger-division 警告常量整数除法结果被截断。 -Wintrinsic-shadow 如果用户过程与内在函数同名,则发出警告。 -Wintrinsics-std 对不属于所选标准的内部函数发出警告。 -Winvalid-memory-model 当已知原子内存模型参数超出有效范围时发出警告。 -Winvalid-offsetof 警告“offsetof”宏的无效使用。 -Winvalid-pch 警告已找到但未使用的 PCH 文件。 -Wjump-misses-init 当跳转错过变量初始化时发出警告。 -Wlarger-than- 与 -Wlarger-than= 相同。 请改用后一个选项。 -Wlarger-than=<字节大小> 如果对象的大小超过<字节大小>,则发出警告。 -Wline-truncation 警告源代码行被截断。 -Wliteral-suffix 当字符串或字符文字后跟不以下划线开头的 ud 后缀时发出警告。 -Wlogic-not-parentheses 在比较的左侧操作数上使用逻辑非时发出警告。 -Wlogic-op 当逻辑运算符总是可疑地评估为 true 或 false 时发出警告。 -Wlong-long 当 -pedantic 时,不要警告使用“long long”。 -Wlto-type-mismatch 在链接时优化期间警告全局声明的类型不匹配。 -Wmain 警告可疑的“main”声明。 -Wmaybe-uninitialized 警告可能未初始化的自动变量。 -Wmemset-elt-size 警告对 memset 的可疑调用,其中第三个参数包含未乘以元素大小的元素数。 -Wmemset-transpose-args 警告对 memset 的可疑调用,其中第三个参数是常量文字零,而第二个参数不是。 -Wmisleading-indentation 当代码的缩进未反映块结构时发出警告。 -Wmissing-attributes 警告实体声明可能缺少已声明相关实体的属性。 -Wmissing-braces 警告初始值设定项周围可能缺少大括号。 -Wno-alloca-larger-than -Wno-alloca-larger-than 禁用 Walloca-larger-than= 警告。 相当于 Walloca-larger-than= -Wno-vla-larger-than -Wno-vla-larger-than 禁用 Wvla-larger-than= 警告。 相当于 Wvla-larger-than=<SIZE_MAX> 或 -Wnoexcept 当 noexcept 表达式计算结果为 false 时发出警告,即使该表达式实际上无法抛出异常。 -Wnoexcept-type 如果 C++17 noexcept 函数类型将更改符号的损坏名称,则发出警告。 -Wnon-template-friend 在模板内声明非模板化友元函数时发出警告。 -Wnon-virtual-dtor 对非虚拟析构函数发出警告。 -Wnonnull 警告 NULL 被传递到标记为需要非 NULL 的参数槽。 -Wnonnull-compare 如果将具有非空属性的指针参数与 NULL 进行比较,则发出警告。 -Wnormalized 与 -Wnormalized= 相同。 请改用后一个选项。 -Wnormalized=`[none -Wnull-dereference 如果取消引用 NULL 指针可能导致错误或未定义的行为,则发出警告。 -Wodr 警告链接时优化期间某些 C++ 单一定义规则违规。 -Wold-style-cast 如果程序中使用了 C 风格转换,则发出警告。 -Wold-style-declaration 警告声明中过时的用法。 -Wold-style-definition 如果使用旧式参数定义,则发出警告。 -Wopenmp-simd 如果 simd 指令被矢量化器成本模型覆盖,则发出警告。 -Woverflow 警告算术表达式中的溢出。 -Woverlength-strings 如果字符串长于标准指定的最大可移植长度,则发出警告。 -Woverloaded-virtual 对重载的虚拟函数名称发出警告。 -Woverride-init 警告覆盖初始值设定项,而不会产生副作用。 -Woverride-init-side-effects 警告有关重写初始化程序带来的副作用。 -Wpacked 当 Packed 属性对结构布局没有影响时发出警告。 -Wpacked-bitfield-compat 关于 GCC 4.4 中偏移量发生变化的打包位域发出警告。 -Wpacked-not-aligned 当具有 Packed 属性的结构中的字段未对齐时发出警告。 --Wpadded 当需要填充来对齐结构成员时发出警告。 -Wpedantic 发出严格遵守标准所需的警告。 -Wpessimizing-move 警告有关在 return 语句中对本地对象调用 std::move 的情况,以防止复制省略。 -Wplacement-new 对于具有未定义行为的放置新表达式发出警告。 与-Wplacement-new=相同。 -Wplacement-new=<0,2> 对于具有未定义行为的放置新表达式发出警告。 -Wpmf-conversions 将指针类型转换为成员函数时发出警告。 -Wpointer-arith 关于函数指针算术的警告。 -Wpointer-compare 当指针与零字符常量进行比较时发出警告。 -Wpointer-sign 当赋值中指针的符号不同时发出警告。 -Wpointer-to-int-cast 当指针转换为不同大小的整数时发出警告。 -Wpragmas 警告有关编译指示的误用。 -Wprio-ctor-dtor 如果使用优先级为 0 到 100 的构造函数或析构函数,则发出警告。 -Wproperty-assign-default 如果 Objective-C 对象的属性没有指定分配语义,则发出警告。 -Wprotocol 如果继承的方法未实现则发出警告。 -Wpsabi 该选项缺乏文档。 -Wreal-q-constant 警告带有“q”指数字母的实数常量。 -Wrealloc-lhs 重新分配左侧数组变量时发出警告。 -Wrealloc-lhs-all 重新分配左侧变量时发出警告。 -Wredundant-decls 警告同一对象的多个声明。 -Wredundant-move 警告对 std::move 的冗余调用。 -Wregister 警告有关寄存器存储说明符的使用。 -Wreorder 当编译器重新排序代码时发出警告。 -Wrestrict 当参数传递给带有另一个参数的限制限定参数别名时发出警告。 -Wreturn-local-addr 关于返回本地或临时变量的指针/引用的警告。 -Wreturn-type 当函数的返回类型默认为“int”(C) 或不一致的返回类型 (C++) 时发出警告。 -Wscalar-storage-order 对涉及反向标量存储顺序的可疑结构发出警告。 -Wselector 如果选择器有多个方法则发出警告。 -Wsequence-point 对可能的违规行为发出警告 -Wshadow 当一个变量影响另一个变量时发出警告。 与 -Wshadow=global 相同。 -Wshadow-compatible-local 与 -Wshadow=兼容-本地相同。 请改用后一个选项。 -Wshadow-ivar 如果局部声明隐藏了实例变量,则发出警告。 -Wshadow-local 与 -Wshadow=local 相同。 请改用后一个选项。 -Wshadow=compatible-local 当一个局部变量遮盖另一局部变量或兼容类型的参数时发出警告。 -Wshadow=global 当一个变量影响另一个变量(全局)时发出警告。 与 -Wshadow 相同。 -Wshadow=local 当一个局部变量遮蔽另一局部变量或参数时发出警告。 -Wshift-count-negative 如果班次计数为负则发出警告。 -Wshift-count-overflow 如果移位计数 >= 类型宽度,则发出警告。 -Wshift-negative-value 如果左移负值则发出警告。 -Wshift-overflow 如果有符号值的左移溢出,则发出警告。 与-Wshift-overflow=相同。 -Wshift-overflow=<0,2> 如果有符号值的左移溢出,则发出警告。 -Wsign-compare 关于有符号与无符号比较的警告。 -Wsign-conversion 对有符号和无符号整数之间的隐式类型转换发出警告。 -Wsign-promo 当过载从无符号升级到有符号时发出警告。 -Wsized-deallocation 警告缺少大小的释放函数。 -Wsizeof-array-argument 当 sizeof 应用于声明为数组的参数时发出警告。 -Wsizeof-pointer-div 警告两个 sizeof 表达式的可疑除法,这些除法不能与指针正常工作。 -Wsizeof-pointer-memaccess 如果参数使用 sizeof,则警告某些字符串函数的可疑长度参数。 -Wstack-protector 由于某种原因未发出堆栈粉碎保护时发出警告。 -Wstack-usage=<字节大小> 如果堆栈使用量可能超过<字节大小>,则发出警告。 -Wstrict-aliasing 警告可能违反严格别名规则的代码。 -Wstrict-aliasing=<0,3> 警告可能违反严格别名规则的代码。 -Wstrict-null-sentinel 对用作哨兵的未强制转换的 NULL 发出警告。 -Wstrict-overflow 对假设有符号溢出未定义的优化发出警告。 -Wstrict-overflow=<0,5> 对假设有符号溢出未定义的优化发出警告。 -Wstrict-prototypes 对非原型函数声明发出警告。 -Wstrict-selector-match 如果候选方法的类型签名不完全匹配,则发出警告。 -Wstringop-overflow 警告字符串操作函数(如 memcpy 和 strcpy)中的缓冲区溢出。 与 -Wstringop-overflow= 相同。 -Wstringop-overflow=<0,4> 在对象大小类型的控制下,警告字符串操作函数(如 memcpy 和 strcpy)中的缓冲区溢出。 -Wstringop-truncation 对 strncat 和 strncpy 等字符串操作函数中的截断发出警告。 -Wsubobject-linkage 如果类类型具有其类型使用匿名命名空间或依赖于无链接的类型的基类或字段,则发出警告。 -Wsuggest-attribute=cold 警告可能是 __attribute__((cold)) 候选函数的函数。 -Wsuggest-attribute=const 警告可能是 __attribute__((const)) 候选函数的函数。 -Wsuggest-attribute=format 警告可能是格式属性候选者的函数。 -Wsuggest-attribute=malloc 警告可能是 __attribute__((malloc)) 候选函数的函数。 -Wsuggest-attribute=noreturn 警告可能是 __attribute__((noreturn)) 候选函数的函数。 -Wsuggest-attribute=pure 警告可能是 __attribute__((pure)) 候选函数的函数。 -Wsuggest-final-methods 对 C++ 虚拟方法发出警告,其中添加 Final 关键字将提高代码质量。 -Wsuggest-final-types 对 C++ 多态类型发出警告,其中添加 Final 关键字将提高代码质量。 -Wsuggest-override 建议当虚函数的声明覆盖另一个虚函数时使用 override 关键字。 -Wsurprising 警告“可疑”结构。 -Wswitch 警告枚举开关,没有默认值,缺少大小写。 -Wswitch-bool 警告带有布尔控制表达式的开关。 -Wswitch-default 警告枚举开关缺少“default:”语句。 -Wswitch-enum 警告所有枚举开关缺少特定情况。 -Wswitch-unreachable 对 switch 的控制表达式和第一种情况之间的语句发出警告。 -Wsync-nand 使用 __sync_fetch_and_nand 和 __sync_nand_and_fetch 内置函数时发出警告。 -Wsynth 已弃用。 该开关没有任何作用。 -Wsystem-headers 不要抑制来自系统标头的警告。 -Wtabs 允许制表符的不合格使用。 -Wtarget-lifetime 如果指针赋值中的指针可能比其目标寿命更长,则发出警告。 -Wtautological-compare 如果比较结果始终为 true 或 false,则发出警告。 -Wtemplates 对主模板声明发出警告。 -Wterminate 如果 throw 表达式总是导致调用 Terminate(),则发出警告。 -Wtraditional 对传统 C 中不存在的功能发出警告。 -Wtraditional-conversion 警告原型导致的类型转换与没有原型时发生的类型转换不同。 -Wtrampolines 每当生成蹦床时发出警告。 -Wtrigraphs 如果遇到可能影响程序含义的三字母组,则发出警告。 -Wtype-limits 如果由于数据类型的有限范围而导致比较始终为 true 或始终为 false,则发出警告。 -Wundeclared-selector 警告没有先前声明的方法的 @selector()。 -Wundef 如果 #if 指令中使用了未定义的宏,则发出警告。 -Wundefined-do-loop 警告无效的 DO 循环。 -Wunderflow 警告数值常量表达式下溢。 -Wuninitialized 警告未初始化的自动变量。 -Wunknown-pragmas 警告无法识别的pragmas。 -Wunreachable-code 不执行任何操作。 保留是为了向后兼容。 -Wunsafe-loop-optimizations 什么也不做。 保留是为了向后兼容。 -Wunsuffixed-float-constants 警告无后缀的浮点常量。 -Wunused 启用所有 -Wunused- 警告。 -Wunused-but-set-parameter 当函数参数仅被设置时发出警告,否则未使用。 -Wunused-but-set-variable 当变量仅被设置时发出警告,否则未使用。 -Wunused-const-variable 当 const 变量未被使用时发出警告。 与 -Wunused-const-variable= 相同。 -Wunused-const-variable=<0,2> 当 const 变量未被使用时发出警告。 -Wunused-dummy-argument 警告未使用的虚拟参数。 -Wunused-function 当函数未被使用时发出警告。 -Wunused-label 当标签未使用时发出警告。 -Wunused-local-typedefs 当未使用函数中本地定义的 typedef 时发出警告。 -Wunused-macros 警告主文件中定义的未使用的宏。 -Wunused-parameter 当函数参数未使用时发出警告。 -Wunused-result 如果用属性 warn_unused_result 标记的函数的调用者不使用其返回值,则发出警告 -Wunused-value 当表达式值未使用时发出警告。 -Wunused-variable 当变量未被使用时发出警告。 -Wuse-without-only 警告没有 ONLY 限定符的 USE 语句。 -Wuseless-cast 警告无用的施法。 -Wvarargs 警告用于检索变量参数的宏的可疑使用。 -Wvariadic-macros 警告有关使用可变参数宏。 -Wvector-operation-performance 在 SIMD 外部编译向量运算时发出警告。 -Wvirtual-inheritance 对直接虚拟继承发出警告。 -Wvirtual-move-assign 如果虚拟基地具有重要的移动分配运算符,则发出警告。 -Wvla 如果使用可变长度数组则发出警告。 -Wvla-larger-than= 对可变长度数组的无限使用以及边界可能大于字节的可变长度数组的有限使用发出警告。 <数 -Wvolatile-register-var 当寄存器变量被声明为易失性时发出警告。 -Wwrite-strings 在 C++ 中,非零表示警告已弃用的从字符串文字到“char *”的转换。
    在C中,类似的警告,除了转换当然是ISO C 标准 -Wzero-as-null-pointer-constant 当文字“0”用作空指针时发出警告。 -Wzerotrip 警告零跳闸 DO 循环。 -frequire-return-statement 返回值的函数必须以 return 语句结尾。 [1]GCC, the GNU Compiler Collection: https://gcc.gnu.org/
    [2]GCC 参数详解: https://www.runoob.com/w3cnote/gcc-parameter-detail.html
    [3]gcc和g++是什么,有什么区别?: http://c.biancheng.net/view/7936.html
    [4]gcc-13.1.0: https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc.pdf