`
isiqi
  • 浏览: 16560380 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

GCC编译优化指南

阅读更多

GCC编译优化指南

作者:金步国


版权声明

本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。

其他作品

本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:

BUG报告,切磋与探讨

由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:Email: csfrank@citiz.net ; QQ: 70171448 ; MSN: csfrank122@hotmail.com


前言

网上关于编译优化的文章很多,但大多零零散散,不成体系,本文试图给出一个完整和清晰的优化思路,同时提供在实践中如何进行优化的详尽参考。但是,在介绍所有优化知识之前首先引用LFS-Book中的一句忠告:“使用编译器优化得到的小幅度性能提升,与它带来的风险相比微不足道”。你还要进行优化吗?

%@&#=^%~*# ...
OK, crazy guy! Let's Go!!

在继续之前,作者还是奉劝各位:如果追求极致的优化,那么它将是一件既耗时又麻烦的事情,你会陷入无止尽的测试、测试、再测试……另外 Gentoo wiki 上有这么一句话:"GCC has well over a hundred individual optimization flags and it would be insane to try and describe them all."所以本文不会涉及全部GCC优化选项。最后作者还是再罗唆一句:优化应当适可而止为好,将精力留出来做一些其它事情会更有意义!

先决条件

本文的主要读者是 LFS/Gentoo 的玩家,基本上比较 crazy 的玩家都接触过,如果你之前从未使用过 LFS/Gentoo ,请先按照《Linux From Scratch 6.2 中文版》做一遍 LFS ,然后再来阅读此文将会更有意义。另外,本文是建立在《深入理解软件包的配置、编译与安装》一文基础之上的,在开始阅读本文之前,请先阅读它。

基本原理

我们首先从三个方面来看与优化相关的内容:

  1. 从运行时的依赖关系来看,对性能有较大影响的组件有 kernel 和 glibc ,虽然这严格说来这不属于本文的话题,但是经过精心选择、精心配置、精心编译的内核与C库将对提高系统的运行速度起着基础性的作用。
  2. 从被编译的软件包来看,每个软件包的 configure 脚本都提供了许多配置选项,其中有许多选项是与性能息息相关的。比如,对于 Apache-2.2.3 而言,你可以使用 --enable-MODULE=static 将模块静态编译进核心,使用 --disable-MODULE 禁用不需要的模块,使用 --with-mpm=MPM 选择一个高效的多路处理模块,在不需要IPv6的情况下使用 --disable-ipv6 禁用IPv6支持,在不使用线程化的MPM时使用 --disable-threads 禁用线程支持,等等……这部分内容显然不可能在本文中进行完整的讲述,本文只能讲述与优化相关的通用选项。针对特定的软件包,请在编译前使用 configure --help 查看所有选项,并精心选择。
  3. 从编译过程自身来看,将源代码编译为二进制文件是在 Makefile 文件的指导下,由 make 程序调用一条条编译命令完成的。而将源代码编译为二进制文件又需要经过以下四个步骤:预处理(cpp) → 编译(gcc或g++) → 汇编(as) → 连接(ld) ;括号中表示每个阶段所使用的程序,它们分别属于 GCC 和 Binutils 软件包。显然的,优化应当从编译工具自身的选择以及控制编译工具的行为入手。

大体上编译优化就这"三板斧"(其实是"三脚猫")了,本文接下来的内容将讨论这只猫的后两只脚。

编译工具的选择

对于编译工具自身的选择,在假定使用 Binutils 和 GCC 以及 Make 的前提下,没什么好说的,基本上新版本都能带来性能提升,同时比老版本对新硬件的支持更好,所以应当尽量选用新版本。不过追新也可能带来系统的不稳定,这就要针对实际情况进行权衡了。本文以 Binutils-2.17 和 GCC-4.1.1 以及 Make-3.81 为例进行说明。

configure 选项

这里我们只讲解通用的"体系结构选项",由于"特性选项"在每个软件包之间千差万别,所以不可能在此处进行讲解。

这部分内容很简单,并且其含义也是不言而喻的,下面只列出常用的值:

  • i586-pc-linux-gnu
  • i686-pc-linux-gnu
  • x86_64-pc-linux-gnu
  • powerpc-unknown-linux-gnu
  • powerpc64-unknown-linux-gnu

如果你实在不知道应当使用哪一个,那么就干脆不使用这几个选项,让 config.guess 脚本自己去猜吧,反正也挺准的。

编译选项

让我们先看看 Makefile 规则中的编译命令通常是怎么写的。

大多数软件包遵守如下约定俗成的规范:

#1,首先从源代码生成目标文件(预处理,编译,汇编),"-c"选项表示不执行链接步骤。
$(CC) $(CPPFLAGS) $(CFLAGS) example.c   -c   -o example.o
#2,然后将目标文件连接为最终的结果(连接),"-o"选项用于指定输出文件的名字。
$(CC) $(LDFLAGS) example.o   -o example

#有一些软件包一次完成四个步骤:
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c   -o example

当然也有少数软件包不遵守这些约定俗成的规范,比如:

#1,有些在命令行中漏掉应有的Makefile变量(注意:有些遗漏是故意的)
$(CC) $(CFLAGS) example.c    -c   -o example.o
$(CC) $(CPPFLAGS) example.c  -c   -o example.o
$(CC) example.o   -o example
$(CC) example.c   -o example
#2,有些在命令行中增加了不必要的Makefile变量
$(CC) $(CFLAGS) $(LDFLAGS) example.o   -o example
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c   -c   -o example.o

当然还有极个别软件包完全是"胡来":乱用变量(增加不必要的又漏掉了应有的)者有之,不用$(CC)者有之,不一而足.....

尽管将源代码编译为二进制文件的四个步骤由不同的程序(cpp,gcc/g++,as,ld)完成,但是事实上 cpp, as, ld 都是由 gcc/g++ 进行间接调用的。换句话说,控制了 gcc/g++ 就等于控制了所有四个步骤。从 Makefile 规则中的编译命令可以看出,编译工具的行为全靠 CC/CXX CPPFLAGS CFLAGS/CXXFLAGS LDFLAGS 这几个变量在控制。当然理论上控制编译工具行为的还应当有 AS ASFLAGS ARFLAGS 等变量,但是实践中基本上没有软件包使用它们。

那么我们如何控制这些变量呢?一种简易的做法是首先设置与这些 Makefile 变量同名的环境变量并将它们 export 为全局,然后运行 configure 脚本,大多数 configure 脚本会使用这同名的环境变量代替 Makefile 中的值。但是少数 configure 脚本并不这样做,你必须手动编辑生成的 Makefile 文件,在其中寻找这些变量并修改它们的值。一些源码包在每个子文件夹中都有 Makefile 文件,真是一件很累人的事!

CC 与 CXX

这是 C 与 C++ 编译器命令。默认值一般是 "gcc" 与 "g++"。这个变量本来与优化没有关系,但是有些人因为担心软件包不遵守那些约定俗成的规范,害怕自己苦心设置的 CFLAGS/CXXFLAGS/LDFLAGS 之类的变量被忽略了,而索性将原本应当放置在其它变量中的选项一股老儿塞到 CC 或 CXX 中,比如:CC="gcc -march=k8 -O2 -s"。这是一种怪异的用法,本文不提倡这种做法,而是提倡按照变量本来的含义使用变量。

CPPFLAGS

这是用于预处理阶段的选项。不过能够用于此变量的选项,看不出有哪个与优化相关。如果你实在想设一个,那就使用下面这个吧:

-DNDEBUG
"NDEBUG"是一个标准的 ANSI 宏,表示不进行调试编译。

CFLAGS 与 CXXFLAGS

CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且在Intel/AMD平台上默认按照i386处理器来编译,也就是 CFLAGS="-O2 -march=i386", CXXFLAGS=$CFLAGS 。事实上,"-O2"已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可。

先说说"-O3"在"-O2"基础上增加的几项:

-finline-functions
允许编译器选择某些简单的函数在其被调用处展开,比较安全的选项,特别是在CPU二级缓存较大时建议使用。
-funswitch-loops
将循环体中不改变值的变量移动到循环体之外。
-fgcse-after-reload
为了清除多余的溢出,在重载之后执行一个额外的载入消除步骤。

另外:

-fomit-frame-pointer
对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,同时对许多函数提供一个额外的寄存器。所有"-O"级别都打开它,但仅在调试器可以不依靠栈指针运行时才有效。在AMD64平台上此选项默认打开,但是在x86平台上则默认关闭。建议显式的设置它(已知在x86上会造成glibc-2.3.4出现nptl测试错误)。
-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N
这四个对齐选项在"-O2"中打开,但是其中的N使用的是默认值。如果你想指定不同于默认值的N,也可以单独指定。比如,对于L2-cache>=512K的cpu而言,指定 -falign-functions=64 可能会获得更好的性能。

调试选项:

-fpretend-float
交叉编译的时候,假定目标机和宿主机使用同样的浮点格式。它导致输出错误的浮点常数,但是在目标机上运行的时候,真实的指令序列有可能和GNU CC希望的一样。
-fprofile-arcs
在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用 -fbranch-probabilities 编译,文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

全局选项:

-pipe
在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。

目录选项:

--sysroot=dir
将dir作为逻辑根目录。比如编译器通常会在 /usr/include 和 /usr/lib 中搜索头文件和库,使用这个选项后将在 dir/usr/include 和 dir/usr/lib 目录中搜索。如果使用这个选项的同时又使用了 -isysroot 选项,则此选项仅作用于库文件的搜索路径,而 -isysroot 选项将作用于头文件的搜索路径。这个选项与优化无关,但是在 CLFS 中有着神奇的作用。

代码生成选项:

-fno-bounds-check
关闭所有对数组访问的边界检查。该选项将提高数组索引的性能,但当超出数组边界时,可能会造成不可接受的行为。
-freg-struct-return
如果struct和union足够小就通过寄存器返回,这将提高较小结构的效率。如果不够小,无法容纳在一个寄存器中,将使用内存返回。这是一个比较安全的选项。
-fpic
生成可用于共享库的位置独立代码。所有的内部寻址均通过全局偏移表完成。要确定一个地址,需要将代码自身的内存位置作为表中一项插入。该选项产生可以在共享库中存放并从中加载的目标模块。
-fstack-check
为防止程序栈溢出而进行必要的检测,仅在多线程环境中运行时才可能需要它。
-fvisibility=hidden
设置默认的ELF镜像中符号的可见性为隐藏。使用这个特性可以非常充分的提高连接和加载共享库的性能,生成更加优化的代码,提供近乎完美的API输出和防止符号碰撞。我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility-inlines-hidden 选项。

硬件体系结构相关选项[仅仅针对x86与x86_64]:

-march=cpu-type
为特定的cpu-type编译二进制代码(不能在更低级别的cpu上运行)。Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona 。AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)
-mfpmath=sse
P3和athlon-xp级别及以上的cpu支持"sse"浮点指令。不过由于glibc头文件的限制,"sse"常常使编译出的二进制文件运行更慢,建议不要使用该选项。
-malign-double
将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大,并且可能不能与未使用该选项编译的程序一起工作。
-m128bit-long-double
指定long double为128位,pentium以上的cpu更喜欢这种标准,并且符合x86-64的ABI标准,但是却不附合i386的ABI标准。
-mregparm=N
指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。
-msseregparm
使用SSE寄存器传递float和double参数和返回值。注意:当你使用了这个选项以后,你必须使用同一参数重新构建所有的模块,包括所有的库。
-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 同时使用,因为会造成代码效率低下。
-m64
生成专门运行于64位环境的代码,不能运行于32位环境,仅用于x86_64[含EMT64]环境。
-mcmodel=small
[默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也可以动态连接。仅用于x86_64[含EMT64]环境。
-mcmodel=kernel
内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!仅用于x86_64[含EMT64]环境。
-mcmodel=medium
程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可以动态连接。注意:共享库不能使用这个选项编译!仅用于x86_64[含EMT64]环境。

其它优化选项:

-fforce-addr
必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-finline-limit=n
对伪指令数超过n的函数,编译程序将不进行内联展开,默认为600。增大此值将增加编译时间和编译内存用量,但是可以得到更优化的结果。
-fmerge-all-constants
试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每个变量都必须有不同的存储位置。
-fgcse-sm
在全局公共子表达式消除之后运行存储移动,以试图将存储移出循环。gcc-3.4中曾属于"-O2"级别的选项。
-fgcse-las
在全局公共子表达式消除之后消除多余的在存储到同一存储区域之后的加载操作。gcc-3.4中曾属于"-O2"级别的选项。
-floop-optimize2
使用 -floop-optimize 循环优化(包含在"-O1"中)的改进版本。
-funsafe-loop-optimizations
假定循环不会溢出,并且循环的退出条件不是无穷。这将可以在一个比较广的范围内进行循环优化,即使优化器自己也不能断定这样做是否正确。
-fsched-spec-load
允许一些装载指令执行一些投机性的动作。
-ftree-loop-linear
在trees上进行线型循环转换。它能够改进缓冲性能并且允许进行更进一步的循环优化。
-fivopts
在trees上执行归纳变量优化。
-ftree-vectorize
在trees上执行循环向量化。
-ftracer
执行尾部复制以扩大超级块的尺寸,它简化了函数控制流,从而允许其它的优化措施做的更好。据说挺有效。
-funroll-loops
仅对循环次数能够在编译时或运行时确定的循环进行展开,生成的代码尺寸将变大,执行速度可能变快也可能变慢。
-fprefetch-loop-arrays
生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。具体效果如何取决于代码。
-fweb
为每个web结构体分配一个伪寄存器,提供更佳的缓存器使用率。gcc-3.4中曾属于"-O3"级别的选项。
-ffast-math
违反IEEE/ANSI标准以提高浮点数计算速度,是个危险的选项,仅在编译不需要严格遵守IEEE规范且浮点计算密集的程序考虑采用。
-fsingle-precision-constant
将浮点常量作为单精度常量对待,而不是隐式地将其转换为双精度。
-fbranch-probabilities
在使用 -fprofile-arcs 选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,文件中所产生的信息将被用来优化那些经常发生的分支代码。如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-frename-registers
试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。gcc-3.4中曾属于"-O3"级别的选项。
-fbranch-target-load-optimize
-fbranch-target-load-optimize2
在执行序启动以及结尾之前执行分支目标缓存器加载最佳化。
-fstack-protector
在关键函数的堆栈中设置保护值。在返回地址和返回值之前,都将验证这个保护值。如果出现了缓冲区溢出,保护值不再匹配,程序就会退出。程序每次运行,保护值都是随机的,因此不会被远程猜出。
-fstack-protector-all
同上,但是在所有函数的堆栈中设置保护值。
--param max-gcse-memory=xxM
执行GCSE优化使用的最大内存量(xxM),太小将使该优化无法进行,默认为50M。
--param max-gcse-passes=n
执行GCSE优化的最大迭代次数,默认为 1。

传递给汇编器的选项:

-Wa,options
options是一个或多个由逗号分隔的可以传递给汇编器的选项列表。其中的每一个均可作为命令行选项传递给汇编器。
-Wa,--strip-local-absolute
从输出符号表中移除局部绝对符号。
-Wa,-R
合并数据段和正文段,因为不必在数据段和代码段之间转移,所以它可能会产生更短的地址移动。
-Wa,--64
设置字长为64。仅用于x86_64,并且仅对ELF格式的目标文件有效。

仅可用于 CFLAGS 的选项:

-fhosted
按宿主环境编译,其中需要有完整的标准库,入口必须是main()函数且具有int型的返回值。内核以外几乎所有的程序都是如此。该选项隐含设置了 -fbuiltin,且与 -fno-freestanding 等价。
-ffreestanding
按独立环境编译,该环境可以没有标准库,且对main()函数没有要求。最典型的例子就是操作系统内核。该选项隐含设置了 -fno-builtin,且与 -fno-hosted 等价。

仅可用于 CXXFLAGS 的选项:

-fno-enforce-eh-specs
C++标准要求强制检查异常违例,但是该选项可以关闭违例检查,从而减小生成代码的体积。该选项类似于定义了"NDEBUG"宏。
-fno-rtti
如果没有使用'dynamic_cast'和'typeid',可以使用这个选项禁止为包含虚方法的类生成运行时表示代码,从而节约空间。此选项对于异常处理无效(仍然按需生成rtti代码)。
-ftemplate-depth-n
将最大模版实例化深度设为'n',符合标准的程序不能超过17,默认值为500。
-fno-optional-diags
禁止输出诊断消息,C++标准并不需要这些消息。
-fno-threadsafe-statics
GCC自动在访问C++局部静态变量的代码上加锁,以保证线程安全。如果你不需要线程安全,可以使用这个选项。
-fvisibility-inlines-hidden
默认隐藏所有内联函数,从而减小导出符号表的大小,既能缩减文件的大小,还能提高运行性能,我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility=hidden 选项。

LDFLAGS

LDFLAGS 是传递给连接器的选项。这是一个常被忽视的变量,事实上它对优化的影响也是很明显的。

-s
删除可执行程序中的所有符号表和所有重定位信息。其结果与运行命令 strip 所达到的效果相同。
-static
连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。
-shared
链接器将生成共享目标代码,该共享库可在运行时动态链接到程序形成完整可执行体。而且,如果使用 gcc 命令创建共享库作为其输出,该选项可以防止链接器将缺失 main() 方法视为错误。为了可以正确工作,应该一致地使用选项 -fpic 和 -fPIC 以及目标平台选项编译构成同一库的所有共享目标模块。特别是,该选项可能需要生成特殊代码来让构造函数正常工作。由于不正确的选项设定而产生的错误可能很不明显,而且也没有警告消息。
-shared-libgcc
链接共享版本的libgcc 。当应用程序需要从一个共享库代码抛出另一个共享库捕获的异常时,需要使用共享版本的libgcc 。
-static-libgcc
链接静态版本的libgcc 。该选项可能会引起 C++ 和 Java 中的异常处理问题。
-Wl,options
options是由一个或多个逗号分隔的传递给链接器的选项列表。其中的每一个选项均会作为命令行选项提供给链接器。
-Wl,-On
当n>0时将会优化输出,但是会明显增加连接操作的时间,这个选项是比较安全的。
-Wl,--sort-common
把全局公共符号按照大小排序后放到适当的输出节,以防止符号间因为排布限制而出现间隙。
-Wl,--no-keep-memory
按需读取符号表而不是将它们缓存在内存中,这样可以减少内存用量,但是会降低运行速度。仅在连接大型可执行文件时有些意义。
-Wl,-s
剥离输出文件中所有的符号信息,这个选项是比较安全的。
-Wl,-z now
默认仅在需要时才动态加载共享代码,这样减少了内存用量,但是可能降低运行速度。而使用这个选项可以强制在启动时就加载共享代码,这可能导致启动速度减慢,并且占用更多的内存,但是运行速度时速度可能加快。
-Wl,--enable-new-dtags
在ELF中创建新式的"dynamic tags",但在老式的ELF系统上无法识别。
-Wl,--as-needed
移除不必要的符号引用,仅在实际需要的时候才连接,可以生成更高效的代码。

最后说两个与优化无关的系统环境变量,因为会影响GCC编译程序的方式,下面两个是咱中国人比较关心的:

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"。
分享到:
评论

相关推荐

    GCC编译优化指南【作者:金步国】

    ### GCC编译优化指南 GCC(GNU Compiler Collection)作为一款广泛使用的开源编译器套件,在软件开发领域占据着举足轻重的地位。其强大的功能不仅限于C、C++语言的支持,还涵盖了Fortran、Ada、Objective-C、Go等...

    GCC编译优化指南 很好的资料

    ### GCC编译优化指南知识点详解 #### 一、引言 GCC(GNU Compiler Collection)作为一款功能强大的开源编译器套件,在软件开发领域扮演着举足轻重的角色。其不仅可以用于C、C++等语言的编译工作,还支持多种架构的...

    GCC编译程序优化指南

    本文档旨在提供一份详尽的GCC编译优化指南,帮助开发者更好地理解和应用这些优化技巧。 #### 二、重要概念与基本原则 1. **优化的目标**:在提高程序性能的同时,需要注意平衡编译时间和目标代码大小等因素。 2. *...

    LINUX下的GCC编译指南

    GCC 编译指南在 LINUX 下的使用方法 GCC 编译指南是 LINUX 下的一种编译工具,主要用于编译 C 语言程序。GCC 编译指南提供了多种参数选项,用于控制编译过程的各个阶段。下面对 GCC 编译指南的使用方法进行详细介绍...

    gcc编译手册

    GCC编译手册详细介绍了如何使用GCC编译器进行程序编译,包括各种命令选项的使用方法以及与特定编程语言相关的语法、标准和支持的扩展。手册中也包含了有关GCC支持的编程语言标准的信息,例如C语言、C++语言以及...

    mips-gcc交叉编译工具压缩包gcc-4.3-ls232.tar.gz

    4. **编译目标程序**:设置好环境变量(如PATH, CC, CXX等),就可以在主机上使用mips-gcc编译针对MIPS设备的程序了。 四、CPU设计实战4.3节中的应用 在CPU设计实战4.3节中,mips-gcc交叉编译工具可能被用来实现...

    金步国作品全集CHM电子书

    [原创文章]GCC编译优化指南 [原创文章]Gentoo 2005.1 完整的USE参数清单中文详解 Linux From Scratch [翻译作品]《Linux From Scratch v6.1.1》 [翻译作品]《Linux 彻底定制指南 v6.2》(合译) [原创文章]《从源...

    DIY一个实用的miniLAPP服务器(x86版).doc

    对于那些对编译优化感兴趣的读者,《GCC 编译优化指南》也是一个值得学习的资源。 目标是构建一个既实用又小巧的LAPP(Linux、Apache、PHP、PostgreSQL)服务器,强调实用性高于体积。尽管如此,该服务器的核心部分...

    linux编译工具GCC中文指南手册

    总的来说,Linux GCC中文指南手册是学习和掌握GCC使用的关键资源,它涵盖了从基本的编译选项到高级的代码优化技巧,对于想要在Linux环境下进行软件开发的程序员来说,是一本不可或缺的参考书。通过深入阅读和实践书...

    GCC 编译器使用指南 (中文版)

    ### GCC编译器使用指南 #### 一、GCC与G++简介 GCC(GNU Compiler Collection)是一套由GNU项目开发的开源编译器集合,它支持多种编程语言,包括C、C++、Objective-C等。GCC不仅是一个编译器,还包含了一组工具链...

    linux 下学生信息管理系统 GCC编译

    1. **GCC编译过程**: - **预处理**:GCC首先执行预处理器cpp,处理#include指令,展开宏定义,并将源代码转化为.i文件。 - **编译**:接着,GCC的编译器cc1将.i文件转换为汇编代码(.s文件),这个阶段主要做语法...

    gcc-8.5.0源码包

    **GCC 8.5.0 源码分析与编译指南** GCC(GNU Compiler Collection)是GNU项目的一部分,是一个广泛使用的开源编译器套件,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、Go等。在本篇文章中,我们将...

    GCC编译软件

    用户可以通过解压这个文件来获取更详细的信息,学习如何使用GCC编译这些语言的程序,或者了解GCC的配置和优化技巧。例如,压缩包可能包括了GCC的安装指南,解释了如何在不同的操作系统上构建和安装GCC;可能还有针对...

    GCC参数大全资料合集,各种技巧

    4. **使用简介**和**使用指南**:这些文档通常包含了一系列教程和示例,指导用户从基础到进阶地使用GCC。它们会介绍如何设置编译环境,如何解决常见问题,以及如何编写有效的Makefile。 5. **Makefile全攻略**:...

    linux编译器GCC编译手册

    ### Linux GCC编译器内联汇编使用指南 #### 概述 GCC(GNU Compiler Collection)作为GNU项目的一部分,是一款广泛应用于Linux环境下的开源编译器。它支持多种编程语言,如C、C++等,并提供了强大的功能集,包括...

    Linux gcc.pdf

    "GCC编译器学习指南" GCC(GNU Compiler Collection)是 GNU 项目的一个重要..."GCC编译器学习指南"是学习 GCC 编译器的不二之选,提供了详细的 GCC 编译原理和使用指南,帮助开发者快速掌握 GCC 编译器的使用和配置。

    gcc_compile.rar_Linux/Unix编程_Unix_Linux_

    GCC编译优化指南作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作...

    arm-linux-gcc-5.4.0交叉编译工具.rar

    ARM-Linux-GCC工具链包含了预编译的C和C++编译器、链接器以及其他必要的工具,如汇编器和调试器,它们都针对ARM处理器进行了优化。 ARM-Linux-GCC 5.4.0 版本包含以下组件: 1. **GCC (GNU Compiler Collection)**...

    gcc指南

    ### GCC指南知识点详解 #### 一、编译C、C++、Objective-C或Fortran程序 GCC(GNU Compiler Collection)不仅支持C语言的编译,同时也支持C++、Objective-C及Fortran等语言的编译。这意味着用户可以根据不同的需求...

Global site tag (gtag.js) - Google Analytics