GCC 编译选项问题转帖

很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径;
以供各位玩家参考

============================
大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。

一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils, gcc, glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!

另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。

为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):
export CFLAGS="-O3 -march=<cpu类型>" && CXXFLAGS=$CFLAGS
这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),
Intel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, prescott, nocona
说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;
prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)
AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx
用AMD的一般都是DIYer,就不必解释了吧。

如果编译时没有抱怨"segmentation fault, core dumped",那么你设定的"-O"优化参数一般就没什么问题。
否则请降低优化级别("-O3" -> "-O2" -> "-O1" -> 取消)。
个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3" ;
不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。

编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。
所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。
比如"-O3"将打开-finline-functions选项,但是可以用"-O3 -fno-inline-functions"既使用-O3的功能又关闭函数内嵌功能。

更多的优化选项请参见:
http://gcc.gnu.org/onlinedocs/gcc-3....e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-3....4-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4....e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4....4-Options.html
所有GCC选项完整列表参见:
http://gcc.gnu.org/onlinedocs/gcc-3....n-Summary.html
http://gcc.gnu.org/onlinedocs/gcc-4....n-Summary.html

有两个页面值的参考:
(对于gentoo-1.4)比较安全的优化选项
http://www.freehackers.org/gentoo/gc...flag_gcc3.html
(对于gentoo-1.4)进阶优化选项
http://www.freehackers.org/gentoo/gc...g_gcc3opt.html

*******************************************************************

哦,忘了说一声,"-O2"已经启用绝大多数安全的优化选项了,所以其实你不必对那一堆选项发愁。
先说说"-O3"在"-O2"基础上增加的几项,你可以按需添加(还算比较安全):
[gcc-3.4.4]
-finline-functions 允许编译器选择某些简单的函数在其被调用处展开
-fweb 为每个web结构体分配一个伪寄存器
-frename-registers 试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。
[gcc-4.0.2]
-finline-functions 说明如上
-funswitch-loops 将循环体中不改变值的变量移动到循环体之外
-fgcse-after-reload **不太明白它的含义**[哪位大峡知道给小弟讲解一下,先行谢过 ]

说完"-O3"再说说在嵌入式系统上常用的"-Os"选项,这个选项其实也很重要,它的含义是对生成的二进制代码进行尺寸上的优化,它打开了所有"-O2"打开的选项,因此通常认为的"-Os"生成的二进制代码执行效率低的潜在意识是错误的!当然该选项与"-O2"的不同之处在于它在"-O2"的基础上禁止了所有为了对齐而插入的空间,也就是将所有"-falign-*"系列的选项禁用了。这种禁用究竟是否一定降低了代码的执行效率,依据程序的不同而不同,据说某些情况下"-Os"的效率比"-O3"还要高14%!请兄弟们在实践中自己摸索吧...

---------------------------------------------

下面选择我认为比较重要的几项简单介绍一下[gcc-3.4.4],GCC选项完整列表太长了!精力有限。
[注意]这里列出的都是非默认的选项,你只需要添加你所需要的选项即可

-w 禁止输出警告消息

-Werror 将所有警告转换为错误

-Wall 显示所有的警告消息

-v 显示编译程序的当前版本号

-V<version> 指定gcc将要运行的版本。只有在安装了多个版本gcc的机器上才有效。

-ansi 按照ANSI标准编译程序,但并不限制与标准并不冲突的GNU扩展(一般不用该选项)

-pedantic 如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)

-std=<name> 指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline (一般不用该选项)

-static 连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。

-shared 连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。
如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。
为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。

-shared-libgcc 该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。

-specs=<filename> gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。
该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。

-pipe 使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。建议使用。

-o <filename> 指定输出文件,对各种输出皆有效。由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。

--help 显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。

--target-help 显示目标机器相关的命令行选项列表

-b<machine> 指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。
目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib/<machine>/<version>

-B<lib-prefix> 指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。
这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。

-I<dir> 指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。

-dumpmachine 显示该程序的目标机名字,不做其他任何动作

-dumpspecs 显示构件编译程序的规范信息,包括用来编译、汇编和连接gcc编译程序自身用到的所有选项,不做其他任何动作。

-dumpversion 显示编译程序自身的版本号,不做其他任何动作

-falign-functions=N 将所有函数的起始地址在N(N=1,2,4,8,16...)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。

-falign-jumps=N 将分支目标在N(N=1,2,4,8,16...)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-fno-align-labels 建议使用它,以保证不和-falign-jumps("-O2"默认启用的选项)冲突

-fno-align-loops 建议使用它,以确保不会在分支目标前插入多余的空指令。

-fbranch-probabilities 在使用"-fprofile-arcs"选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,
文件中所产生的信息将被用来优化那些经常发生的分支代码。如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fno-guess-branch-probability 默认情况下gcc将使用随机模型进行猜测哪个分支更可能被经常执行,并以此来优化代码,该选项关闭它。

-fprofile-arcs 在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用"-fbranch-probabilities"编译,
文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fforce-addr 必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-fforce-mem 必须将数值复制到寄存器中才能对他们进行运算。由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。

-ffreestanding 所编译的程序能够在独立的环境中运行,该环境可以没有标准库,而且可以不从main()函数开始运行。
该选项将设置"-fno-builtin",且等同于"-fno-hosted"。
-fhosted 所编译的程序需要运行在宿主环境中,其中需要有完整的标准库,而且main()函数具有int型的返回值。
-fno-builtin 除非利用"__builtin_"进行引用,否则不识别所有内建函数。

-fmerge-all-constants 试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每个变量都必须有不同的存储位置。

-fmove-all-movables 将所有不变的表达式移动到循环体之外,这种做法的好坏取决于源代码中的循环结构。

-fnon-call-exceptions 产生的代码可供陷阱指令(如非法浮点运算和非法内存寻址)抛出异常,需要相关平台的运行时支持,并不普遍有效。

-fomit-frame-pointer 对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,并将寄存器用于普通用途。
所有"-O"级别都打开着一选项,但仅在调试器可以不依靠栈指针运行时才有效。建议不需要调试的情况下显式的设置它。

-fno-optional-diags 禁止输出诊断消息,C++标准并不需要这些消息。
-fpermissive 将代码中与标准不符合的诊断消息作为警告而不是错误输出。

-fpic 生成可用于共享库的位置独立代码(PIC),所有的内存寻址均通过全局偏移表(GOT)完成。该选项并非在所有的机器上都有效。
要确定一个地址,需要将代码自身的内存位置作为表中的一项插入。该选项可以产生在共享库中存放并从中加载的目标模块。

-fprefetch-loop-arrays 生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。

-freg-struct-return 生成用寄存器返回短结构的代码,如果寄存器无法荣纳将使用内存。

-fstack-check 为防止程序栈溢出而进行必要的检测,在多线程环境中运行时才可能需要它。

-ftime-report 编译完成后显示编译耗时的统计信息

-funroll-loops 如果在编译时可以确定迭代的次数非常少而且循环中的指令也非常少,可以使用该选项进行循环展开,以驱除循环和复制指令。

-finline-limit=<size> 对伪指令数超过<size>的函数,编译程序将不进行展开,默认为600

--param <name>=<value> gcc内部存在一些优化代码程度的限制,调整这些限制就是调整整个优化全局。下面列出了参数的名字和对应的解释:
名字 解释
max-delay-slot-insn-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为100
max-delay-slot-live-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为333
max-gcse-memory 执行GCSE优化使用的最大内存量,太小将使该优化无法进行,默认为50M
max-gcse-passes 执行GCSE优化的最大迭代次数,默认为1

*******************************************************************
说完了命令行选项,下面来说说与硬件体系结构(主要是cpu)相关的设置[仅针对i386/x86_64]
最大名鼎鼎的"-march"上面已经说过了,下面讲讲别的(仅挑些实用的)

-mfpmath=sse P3和athlon-tbird以上级别的cpu支持

-masm=<dialect> 使用指定的dialect输出汇编语言指令,可以使用"intel"或"att";默认为"att"

-mieee-fp 指定编译器使用IEEE浮点比较,这样将会正确的处理比较结果为无序的情况。

-malign-double 将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大。

-m128bit-long-double 指定long double为128位,pentium以上的cpu更喜欢这种标准。

-mregparm=N 指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。

-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
上面的这些不用解释了,一看就明白,根据自己的CPU决定吧

-maccumulate-outgoing-args 指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中是较快的方法;缺点是会增加代码尺寸。

-mthreads 支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。
使用这个选项时会定义"-D_MT",它将包含使用选项"-lmingwthrd"连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。

-minline-all-stringops 嵌入所有的字符串操作。可以提高字符串操作的性能,但是会增加代码尺寸。

-momit-leaf-frame-pointer 不为叶子函数在寄存器中保存栈指针,这样可以节省寄存器,但是将会是调试变的困难。参见"-fomit-frame-pointer"。

下面这几个仅用于x86_64环境:

-m64 生成专门运行于64位环境的代码,不能运行于32位环境

-mcmodel=small [默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也可以动态连接。
-mcmodel=kernel 内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!
-mcmodel=medium 程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可以动态连接。
注意:共享库不能使用这个选项编译!
-mcmodel=large 对地址空间没有任何限制,这个选项的功能目前尚未实现。

==============================
既然已经讲了这么多了索性再讲讲gcc使用的一些环境变量
除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其实是Autoconf的环境变量),再挑几个说说:
所有的PATH类环境变量(除LD_RUN_PATH外)都是用冒号分割的目录列表。

C_INCLUDE_PATH 编译C程序时使用的环境变量,用于查找头文件。

CPLUS_INCLUDE_PATH 编译C++程序时使用的环境变量,用于查找头文件。

OBJC_INCLUDE_PATH 编译Obj-C程序时使用的环境变量,用于查找头文件。

CPATH 编译C/C++/Obj-C程序时使用的环境变量,用于查找头文件。

COMPILER_PATH 如果没有用GCC_EXEC_PREFIX定位子程序,编译程序将会在此查找它的子程序。

LIBRARY_PATH 连接程序将在这些目录中寻找特殊的连接程序文件。

LD_LIBRARY_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:程序会查找该目录列表以寻找共享库。
当不能够在编译程序的目录中找到共享库的时候,执行程序必须设置该环境变量。

LD_RUN_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:它在运行时指出了文件的名字,运行的程序可以由此得到它的符号名字和地址。
由于地址不会重新载入,因而可能符号应用其他文件中的绝对地址。这个和ld工具使用的"-R"选项完全一样。

GCC_EXEC_PREFIX 编译程序执行所有子程序的名字的前缀,默认值是"<prefix>/lib/gcc-lib/",
其中的<prefix>是安装时configure脚本指定的前缀。

LANG 指定编译程序使用的字符集,可用于创建宽字符文件、串文字、注释;默认为英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",不支持中文]

LC_ALL 指定多字节字符的字符分类,主要用于确定字符串的字符边界以及编译程序使用何种语言发出诊断消息;默认设置与LANG相同。
中文相关的几项:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"

TMPDIR 编译程序存放临时工作文件的临时目录,这些临时文件通常在编译结束时被删除。

====================================================================






 

/
 
3.4.2  Gcc编译选项分析
Gcc有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。
(1)总体选项
Gcc的总结选项如表3.7所示,很多在前面的示例中已经有所涉及。
表3.7                                                           Gcc总体选项列表
后 缀 名
所对应的语言
-c
只是编译不链接,生成目标文件“.o”
-S
只是编译不汇编,生成汇编代码
-E
只进行预编译,不做其他处理
-g
在可执行程序中包含标准调试信息
-o file
把输出文件输出到file里
-v
打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir
在头文件的搜索路径列表中添加dir目录
-L dir
在库文件的搜索路径列表中添加dir目录
-static
链接静态库
-llibrary
连接名为library的库文件
 
对于“-c”、“-E”、“-o”、“-S”选项在前一小节中已经讲解了其使用方法,在此主要讲解另外两个非常常用的库依赖选项“-I dir”和“-L dir”。
· “-I dir”
正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。
比如在“/root/workplace/Gcc”下有两个文件:
 
/*hello1.c*/
#include<my.h>
int main()
{
     printf(“Hello!!/n”);
     return 0;
}
/*my.h*/
#include<stdio.h>
 
这样,就可在Gcc命令行中加入“-I”选项:
 
[root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1
 
这样,Gcc就能够执行出正确结果。
 
* 小知识
在include语句中,“<>”表示在标准路径中搜索头文件,““””表示在本目录中搜索。故在上例中,可把hello1.c的“#include<my.h>”改为“#include “my.h””,就不需要加上“-I”选项了。
 
· “-L dir”
选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可:
 
[root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq
 
需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。
另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说Gcc在对”-lsunq”进行处理时,会自动去链接名为libsunq.so的文件。
(2)告警和出错选项
Gcc的告警和出错选项如表3.8所示。
表3.8                                                           Gcc总体选项列表
选    项
含    义
-ansi
支持符合ANSI标准的C程序
-pedantic
允许发出ANSI C标准所列的全部警告信息
选    项
含    义
-pedantic-error
允许发出ANSI C标准所列的全部错误信息
-w
关闭所有告警
-Wall
允许发出Gcc提供的所有有用的报警信息
-werror
把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
 
下面结合实例对这几个告警和出错选项进行简单的讲解。
如有以下程序段:
 
#include<stdio.h>
 
void main()
{
     long long tmp = 1;
     printf(“This is a bad code!/n”);
     return 0;
}
 
这是一个很糟糕的程序,读者可以考虑一下有哪些问题?
· “-ansi”
该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。运行结果如下所示:
 
[root@localhost Gcc]# Gcc –ansi warning.c –o warning
warning.c: 在函数“main”中:
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
 
可以看出,该选项并没有发现”long long”这个无效数据类型的错误。
· “-pedantic”
允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。其运行结果如下所示:
 
[root@localhost Gcc]# Gcc – pedantic warning.c –o warning
warning.c: 在函数“main”中:
warning.c:5 警告:ISO C90不支持“long long”
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
 
可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。
· “-Wall”
允许发出Gcc能够提供的所有有用的报警信息。该选项的运行结果如下所示:
[root@localhost Gcc]# Gcc –Wall warning.c –o warning
warning.c:4 警告:“main”的返回类型不是“int”
warning.c: 在函数”main”中:
warning.c:7 警告:在无返回值的函数中,”return”带返回值
warning.c:5 警告:未使用的变量“tmp”
 
使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。
另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。
(3)优化选项
Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。
不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。
虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。
(4)体系结构相关选项
Gcc的体系结构相关选项如表3.9所示。
表3.9                                                   Gcc体系结构相关选项列表
选    项
含    义
-mcpu=type
针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等
-mieee-fp
使用IEEE标准进行浮点数的比较
-mno-ieee-fp
不使用IEEE标准进行浮点数的比较
-msoft-float
输出包含浮点库调用的目标代码
-mshort
把int类型作为16位处理,相当于short int
-mrtd
强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令
 
这些体系结构相关选项在嵌入式的设计中会有较多的应用,读者需根据不同体系结构将对应的选项进行组合处理。在本书后面涉及到具体实例会有针对性的讲解。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值