📄 gcc 中文手册.htm
字号:
更慢的<BR>编译.一般情形,第二次对成员函数(或对成员数据的引用)建立的调用,必须再次经过<BR>相同长度的处理.这意味着象
这样的代码<BR><BR>cout << "This " << p << " has " << n
<< " legs.\n";<BR><BR>对整个三步骤要做六次遍历.通过使用软件缓存,
``命中''能够显著地减少这种代价<BR>然而不幸的是,使用这种缓存 必须实现其他机制,带来了它自己的开销.
`-fmemoi<BR>ze-lookups'选项打开软件缓存.<BR><BR>因为函数的正文环境不同,函数对成员和成员函数的访问权(可见性)也可能不同,
g<BR>++可能需要刷新缓存. 使用`-fmemoize-lookups'选项,每编译完一个函数就刷新缓<BR>存.而`-fsave-memoized'选项
也启用同样的缓存,但是当编译器发觉最后编译的函<BR>数的正文环境产生的访问权和下一个待编译的函数相同,编译器就
保留缓存内容.这<BR>对某个类定义许多成员函数时非常有用:除了某些其他类的友函数,每个成员函数拥<BR>有和其他成员函数完全一样
的访问权,因而无需刷新缓存.<BR><BR>-fno-default-inline<BR><BR>默认为不要把成员函数内嵌,因为它们定义在类的作用域内(仅C++).<BR><BR>-fno-defer-pop<BR><BR>一旦函数返回,参数就立即弹出.对于那些调用函数后必须弹出参数的机器,编译器一<BR>般情况下让几次函数调用的参数
堆积在栈上,然后一次全部弹出.<BR><BR>-fforce-mem<BR><BR>做数学运算前把将要使用的内存操作数送入寄存器.通过把内存访问转换成潜在的公<BR>共子表达式,它可能产生较好的目标码.
如果它们不是公共子表达式,指令组合应该<BR>消除各自的寄存器载荷.我乐意倾听不同意见.
-fforce-addr<BR><BR>做数学运算前把将要使用的内存地址常数送入寄存器.它可能和`-fforce-mem'一样<BR>产生较好的
目标码.我乐意倾听不同意见.<BR><BR>-fomit-frame-pointer<BR><BR>对于不需要帧指针(frame
pointer)的函数,不要在寄存器中保存帧指针.这样能够避<BR>免保存,设置和恢复 帧指针的指令;同时对许多函数提供一个额外的寄存器.
但是在<BR>大多数机器上将无法调试.<BR><BR>某些机器上,如Vax,这个选项无效,因为标准调用序列自动处理帧指针,通过假装不存<BR>在而不保存任何东西.机器描述宏
FRAME_POINTER_REQUIRED控制目标机是否支持这<BR>个选项.<BR><BR>-finline-functions<BR><BR>把所有简单的函数集成进调用者.编译器探索式地决定哪些函数足够简单,值得这种<BR>集成.<BR><BR>如果集成了所有给定函数的调用,而且函数声明为static,那么一般说来GCC有权不按<BR>汇编代码输出函数.<BR><BR>-fcaller-saves<BR><BR>允许在寄存器里分配数值,但是这个方案通常受到各个函数调用的冲击,因此GCC生成<BR>额外的代码,在函数调用的
前后保存和复原寄存器内容.仅当生成代码看上去优于反<BR>之结果时才实现这样的分配.<BR><BR>某些机器上该选项默认为允许,通常这些机器没有调用保护寄存器代替使用.<BR><BR>-fkeep-inline-functions<BR><BR>即使集成了某个函数的所有调用,而且该函数声明为static,仍然输出这个函数一个<BR>独立的,运行时可调用
的版本.<BR><BR>-fno-function-cse<BR><BR>不要把函数地址存入寄存器;让调用固定函数的指令显式给出函数地址.<BR><BR>这个选项产生效率较低的目标码,但是如果不用这个选项,某些不寻常的hack,改变汇<BR>编器的输出,可能因优化而带来
困惑.<BR><BR>-fno-peephole<BR><BR>禁止任何机器相关的peephole优化.<BR><BR>-ffast-math<BR><BR>这个选项出于速度优化,允许GCC违反某些ANSI或IEEE规则/规格.例如,它允许编译器<BR>假设sqrt
函数的参数是非负数.<BR><BR>这个选项不被任何`-O'选项打开,因为对于严格依靠IEEE或ANSI规则/规格实现的数<BR>学函数,程序可能
会产生错误的结果.<BR><BR>下列选项控制特定的优化. `-O2'选项打开下面的大多数优化项,除了`-funroll-lo<BR>ops'和
`-funroll-all-loops'项.<BR><BR>而`-O'选项通常打开`-fthread-jumps'和`-fdelayed-branch'
优化项,但是特定的<BR>机器上的默认优化项有可能改变.<BR><BR>如果特别情况下非常需要``微调''优化,你可以使用下面的选项.<BR><BR>-fstrength-reduce<BR><BR>执行循环强度缩小(loop
strength
reduction)优化,并且消除重复变量.<BR><BR>-fthread-jumps<BR><BR>执行优化的地点是,如果某个跳转分支的目的地存在另一个条件比较,而且该条件比<BR>较包含在前一个比较语句之内,那么
执行优化.根据条件是true或者false,前面那条<BR>分支重定向到第二条分支的目的地或者紧跟在第二条分支后面.<BR><BR>-funroll-loops<BR><BR>执行循环展开(loop
unrolling)优化.仅对循环次数能够在编译时或运行时确定的循<BR>环实行.<BR><BR>-funroll-all-loops<BR><BR>执行循环展开(loop
unrolling)优化.对所有循环实行.通常使程序运行的更慢.<BR><BR>-fcse-follow-jumps<BR><BR>在公共子表达式消元(common
subexpression elimination)的时候,如果没有其他路<BR>径到达某个跳转的
目的地,就扫过这条jump指令.例如,如果CSE遇到带有else从句的<BR>if语句,当条件测试为 false时,
CSE就跟在jump后面.<BR><BR>-fcse-skip-blocks<BR><BR>它类似于`-fcse-follow-jumps'选项,但是CSE跟在条件跳转后面,条件跳转跳过了<BR>语句块(block).如果CSE遇到一条简单的if语句,不带else从句,
`-fcse-skip-bloc<BR>ks'选项将导致CSE跟在if产生的跳转后面.<BR><BR>-frerun-cse-after-loop<BR><BR>执行循环优化后,重新进行公共子表达式消元.<BR><BR>-felide-constructors<BR><BR>如果看上去合理就省略构造子(仅C++).根据这个选项,对于下面的代码,
GNU C++直<BR>接从调用foo 初始化y,而无需通过临时变量:<BR><BR>A foo (); A y = foo
();<BR><BR>如果没有这个选项, GNU C++首先通过调用类型A 合适的构造子初始化y;然后把
fo<BR>o的结果赋给临时变量;最后,用临时变量替换`y'的初始值.<BR><BR>ANSI
C++标准草案规定了默认行为(`-fno-elide-constructors').如果程序的构造<BR>子存在 副效应,
`-felide-constructors'选项能够使程序有不同的表现,因为可能<BR>忽略一些构造子的调用.<BR><BR>-fexpensive-optimizations<BR><BR>执行一些相对开销较大的次要优化.<BR><BR>-fdelayed-branch<BR><BR>如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed
bra<BR>nch)指令后面的指令空隙.<BR><BR>-fschedule-insns<BR><BR>如果对目标机支持这个功能,它试图重新排列指令,以便消除因数据未绪造成的执行<BR>停顿.这可以帮助浮点运算或内存访问
较慢的机器调取指令,允许其他指令先执行,<BR>直到调取指令或浮点运算完成.<BR><BR>-fschedule-insns2<BR><BR>类似于`-fschedule-insns'选项,但是在寄存器分配完成后,需要一个额外的指令调<BR>度过程.对于
寄存器数目相对较少,而且取内存指令大于一个周期的机器,这个选项<BR>特别有用.<BR><BR><BR><BR>目标机选项(TARGET
OPTION)<BR><BR>缺省情况下, GNU
CC编译出本机类型的目标码.然而也可以把他安装成交叉编译器,<BR>为其他机型编译程序.事实上,针对不同的目标机,可以同时安装GNU
CC相应的配置<BR>然后用`-b'选项指定 目标机种.<BR><BR>顺便提一下,新版本和旧版本的GNU
CC可以共存.其中一个版本(可能是最新的那个)<BR>为缺省版本,但是有时候你希望使用 其他版本.<BR><BR>-b
machine<BR><BR>参数machine指出编译的目标机种.这个选项用于安装为交叉编译器的GNU
CC.<BR><BR>参数machine的值和配置GNU CC交叉编译器时设置的机器类型一样.例如,如果交叉编<BR>译器配置有 `configure
i386v',意思是编译80386上的System V目标码,那么你可以<BR>通过`-b
i386v'运行交叉编译器.<BR><BR>如果没有指定`-b'选项,通常指编译本机目标码.<BR><BR>-V
version<BR><BR>参数version指出运行哪个版本的GNU CC.这个选项用于安装了多个版本的GCC.例如<BR>,如果
version是`2.0',意味着运行GNU CC 2.0版.<BR><BR>如果没有指定`-V'选项,缺省版本取决于GNU
CC的安装方式,一般说来推荐使用通用<BR>版本.<BR><BR><BR><BR>机器相关选项(MACHINE DEPENDENT
OPTION)<BR><BR>每一种目标机型都有自己的特别选项,这些选项用`-m '开关引导,选择不同的硬件型<BR>号或配置---例如,
68010还是68020,有没有浮点协处理器.通过指定选项,安装
编译<BR>器的一个版本能够为所有的型号或配置进行编译.<BR><BR>此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台<BR>的其他编译器.<BR><BR>下面是针对68000系列定义的`-m'选项:<BR><BR>-m68000<BR><BR>-mc68000<BR><BR>输出68000的目标码.如果编译器按基于68000的系统配置,这个选项就是缺省选项.<BR><BR><BR>-m68020<BR><BR>-mc68020<BR><BR>输出68020的目标码(而不是68000).如果编译器按基于68020的系统配置,这个选项就<BR>是缺省选项.<BR><BR>-m68881<BR><BR>输出包含68881浮点指令的目标码.对于大多数基于68020的系统这是缺省选项,除非<BR>设置编译器时指定了
-nfp
.<BR><BR>-m68030<BR><BR>输出68030的目标码.如果编译器按基于68030的系统配置,这个选项就是缺省选项.<BR><BR><BR>-m68040<BR><BR>输出68040的目标码.如果编译器按基于68040的系统配置,这个选项就是缺省选项.<BR><BR><BR>-m68020-40<BR><BR>输出68040的目标码,但是不使用新指令.生成的代码可以在68020/68881上,也可以在<BR>68030或
68040上较有效地运行.<BR><BR>-mfpa<BR><BR>输出包含SUN
FPA浮点指令的目标码.<BR><BR>-msoft-float<BR><BR>输出包含浮点库调用的目标码. 警告:所需的库不是GNU
CC的组成部分.一般说来GC<BR>C使用该机型本地C
编译器的相应部件,但是作交叉编译时却不能直接使用.你必须自<BR>己管理提供合适的函数库用于交叉编译.<BR><BR>-mshort<BR><BR>认为int类型是16位宽,相当于short
int.<BR><BR>-mnobitfield<BR><BR>不使用位域(bit-field)指令.
`-m68000'隐含指定了`-mnobitfield'.<BR><BR>-mbitfield<BR><BR>使用位域指令.
`-m68020'隐含指定了`-mbitfield'.如果你使用未改装的gcc,这就<BR>是
默认选项.<BR><BR>-mrtd<BR><BR>采用另一种函数调用约定,函数接受固定数目的参数,用rtd指令返回,该指令返回时<BR>弹出栈内的参数.这个
方法能够使调用者节省一条指令,因为他这里不需要弹出参数<BR><BR><BR>这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数<BR>,你就不能使用这个选项.<BR><BR>此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成<BR>错误的调用代码.<BR><BR>另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码.
(正常情况<BR>下,多余的参数被安全无害的忽略.)<BR><BR>68010和68020处理器支持rtd指令,但是68000不支持.<BR><BR>下面是针对VAX定义的`-m'选项:<BR><BR>-munix<BR><BR>禁止输出某些跳转指令(aobleq等等),
VAX的UNIX汇编器无法跨越长范围(long ran<BR>ges)
进行处理.<BR><BR>-mgnu<BR><BR>如果使用GNU汇编器,则输出那些跳转指令,<BR><BR>-mg<BR><BR>输出g-format浮点数,取代d-format.<BR><BR>下面是SPARC支持的`-m'选项开关:<BR><BR>-mfpu<BR><BR>-mhard-float<BR><BR>输出包含浮点指令的目标码.这是缺省选项.<BR><BR>-mno-fpu<BR><BR>-msoft-float<BR><BR>输出包含浮点库调用的目标码.
警告:没有为SPARC提供GNU浮点库.一般说来使用该<BR>机型本地C编译器
的相应部件,但是不能直接用于交叉编译.你必须自己安排,提供用<BR>于交叉编译的库函数.<BR><BR>-msoft-float改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有<BR>意义.<BR><BR>-mno-epilogue<BR><BR>-mepilogue<BR><BR>使用-mepilogue
(缺省)选项时,编译器总是把函数的退出代码放在函数的尾部.任何<BR>在函数中间
的退出语句(例如C中的return语句)将产生出跳转指令指向函数尾部.<BR><BR><BR>使用-mno-epilogue选项时,编译器尽量在每个函数退出点嵌入退出代码.<BR><BR>-mno-v8<BR><BR>-mv8<BR><BR>-msparclite<BR><BR>这三个选项选择不同种类的SPARC系统.<BR><BR>默认情况下(除非特别为Fujitsu
SPARClite配置), GCC生成SPARC v7目标码.<BR><BR>-mv8生成SPARC
v8目标码.他和v7目标码唯一的区别是,编译器生成整数乘法和整数<BR>除法指令, SPARC
v8支持该指令,而v7体系不支持.<BR><BR>-msparclite生成SPARClite目标码.增加了SPARClite支持的整数乘法,整数除法单步<BR>扫描
(integer divide step and scan (ffs))指令.
v7体系不支持这些指令.<BR><BR>-mcypress<BR><BR>-msupersparc<BR><BR>这两个选项选择处理器型号,针对处理器进行代码优化.<BR><BR>-mcypress选项(默认项)使编译器对Cypress
CY7C602芯片优化代码, SparcStation<BR>/SparcServer 3xx系列使用这种芯片.该选项也适用于老式的SparcStation
1, 2,<BR>IPX 等机型..<BR><BR>-msupersparc选项使编译器对SuperSparc处理器优化代码, SparcStation 10,
100<BR>0 和2000系列使用这种芯片.同时该选项启用完整的SPARC
v8指令集.<BR><BR>下面是针对Convex定义的`-m'选项:<BR><BR>-mc1<BR><BR>输出C1的目标码.当编译器对C1配置时,这是默认选项.<BR><BR>-mc2<BR><BR>输出C2的目标码.当编译器对C2配置时,这是默认选项.<BR><BR>-margcount<BR><BR>在每个参数列表的前面放置一个参数计数字(argument
count word).某些不可移植<BR>的Convex和Vax 程序需要这个参数计数字.
(调试器不需要他,除非函数带有变长参<BR>数列表;这个信息存放在符号表中.)<BR><BR>-mnoargcount<BR><BR>忽略参数计数字.如果你使用未改装的gcc,这是默认选项.<BR><BR>下面是针对AMD
Am29000定义的`-m'选项:<BR><BR>-mdw<BR><BR>生成的目标码认为DW置位,就是说,字节和半字操作由硬件直接支持.该选项是默认选<BR>项.<BR><BR>-mnodw<BR><BR>生成的目标码认为DW没有置位.<BR><BR>-mbw<BR><BR>生成的目标码认为系统支持字节和半字写操作.该选项是默认选项.<BR><BR>-mnbw<BR><BR>生成的目标码认为系统不支持字节和半字写操作.该选项隐含开启了`-mnodw'选项.<BR><BR><BR>-msmall<BR><BR>使用小内存模式,小内存模式假设所有函数的地址位于某个256
KB段内,或者所有函<BR>数的绝对地址小于256K.这样 就可以用call指令代替const, consth,
calli指令序<BR>列.<BR><BR>-mlarge<BR><BR>假设不能使用call指令;这是默认选项.<BR><BR>-m29050<BR><BR>输出Am29050的目标码.<BR><BR>-m29000<BR><BR>输出Am29000的目标码.这是默认选项.<BR><BR>-mkernel-registers<BR><BR>生成的目标码引用gr64-gr95寄存器而不是gr96-gr127寄存器.该选项可以用于编译<BR>内核代码,内核需要一组全局寄存器,这些全局寄存器和用户模式使用的寄存器完全<BR>无关.<BR><BR>注意,使用这个选项时,
`-f'选项中的寄存器名字必须是normal, user-mode,
name<BR>s.<BR><BR>-muser-registers<BR><BR>使用普通全局寄存器集gr96-gr127.这是默认选项.<BR><BR>-mstack-check<BR><BR>在每次堆栈调整后插入一条__msp_check调用.这个选项常用于内核代码.<BR><BR>下面是针对Motorola
88K体系定义的`-m'选项:<BR><BR>-m88000<BR><BR>生成的目标码可以在m88100和m88110上正常工作.<BR><BR>-m88100<BR><BR>生成的目标码在m88100上工作的最好,但也可以在m88110上运行.<BR><BR>-m88110<BR><BR>生成的目标码在m88110上工作的最好,可能不能在m88100上运行.<BR><BR>-midentify-revision<BR><BR>在汇编器的输
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -