GCC编译器选项及优化提示
GCC编译器选项及优化提示
[原创]GCC编译器选项及优化提示很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gc c的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢============================大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在I nte l/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的M akef ile文件,在其中寻找CF LAGS和C XXFLAG S变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binuti ls, gcc, glibc等等,在每个子文件夹中都有M ak efile文件,这样修改起来就太累了!另一种简易做法是设置C FL AGS和CX XFLA GS环境变量。
大多数c onf igure脚本会使用这两个环境变量代替M akef ile文件中的值。
但是少数c on figure脚本并不这样做,他们必须需要手动编辑才行。
为了设置C FL AGS和CX XFLA GS环境变量,你可以在bas h中执行如下命令(也可以写进.bas hrc以成为默认值):exportC FLA GS="-O3 -marc h=<c pu类型>" && C XXFLAG S=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
"-marc h"选项表示为特定的c pu类型编译二进制代码(不能在更低级别的c pu上运行),I ntel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, pres c ot t, noc ona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的c pu;pres c ot t是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);noc ona则是最新的带有E M T64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx用AMD的一般都是DI Ye r,就不必解释了吧。
C语言中的编译器优化标志有哪些?
C语言中的编译器优化标志有哪些?在 C 语言编程中,编译器优化标志是提升程序性能的重要工具。
它们能够让编译器以不同的方式处理代码,从而生成更高效的机器码。
接下来,让我们详细了解一下常见的编译器优化标志。
首先,“O1”是一个较为基础的优化级别。
它会执行一些常见的优化操作,比如常量折叠、简单的指令替换和消除一些不必要的代码。
常量折叠指的是在编译时直接计算那些在运行时不会改变的值,例如“5 +3”会在编译时直接计算为 8 。
简单的指令替换可能会将一些效率较低的指令替换为更高效的等价指令。
“O2”优化级别比“O1”更进一步。
除了包含“O1”的优化之外,还会进行更多的循环优化和函数内联。
循环优化可以减少循环中的开销,提高循环的执行效率。
函数内联则是将一些小的、被频繁调用的函数直接嵌入到调用它的地方,避免了函数调用的开销。
“O3”是更高级别的优化。
它在“O2”的基础上增加了一些更激进的优化策略,例如强度削减和自动向量化。
强度削减是指将一些复杂的运算转换为更简单但等价的运算,以提高执行速度。
自动向量化则是将一些可以并行执行的操作转换为向量指令,利用现代处理器的向量处理能力来提高性能。
除了上述常见的整体优化级别,还有一些特定的优化标志。
比如“fomitframepointer”,它会省略帧指针以节省空间和提高性能,但这可能会使调试变得更困难。
“funrollloops”标志会将小的循环展开,以减少循环控制的开销,但可能会导致代码体积增大。
“ftreevectorize”明确指示编译器尝试进行向量化优化。
“foptimizesiblingcalls”用于优化兄弟函数调用,以减少函数调用的开销。
“fmergeallconstants”会合并相同的常量,节省存储空间。
另外,不同的编译器可能还提供了一些特定的优化标志。
例如,GCC 编译器中的“fnostrictaliasing”用于控制严格别名规则,这在某些情况下可能会影响优化。
GCC编译选项参数
GCC编译选项参数1. -o,指定输出文件的名称。
例如,gcc -o output main.c将生成一个名为output的可执行文件。
2.-c,只编译源文件但不链接生成可执行文件。
这个选项可以用于分离编译,将源代码和编译后的目标文件分开存放。
3.-g,生成包含调试信息的可执行文件。
这个选项可用于在程序出错时进行调试。
4. -Wall,显示所有警告信息。
这个选项用于尽可能多地检测潜在的错误。
5. -Werror,将警告视为错误。
这个选项会将所有警告信息转化为编译错误,编译过程中如果遇到任何警告就会停止编译。
6. -std,指定所使用的C或C++的标准版本。
例如,-std=c99指定使用C99标准。
7.-I,指定额外的头文件路径。
可以通过多次使用该选项来指定多个路径。
8.-L,指定额外的库文件路径。
可以通过多次使用该选项来指定多个路径。
9. -l,指定要链接的库文件。
例如,-lmath将链接数学库。
10.-O,指定优化级别。
有多个优化级别可选,从-O0(不进行任何优化)到-O3(进行最高级别的优化)。
11.-D,定义预处理宏。
可以使用-D定义宏并为其指定值。
例如,-DDEBUG定义一个名为DEBUG的宏。
12.-U,取消预定义宏的定义。
可以使用-U取消已定义的宏。
13.-E,只进行预处理,生成预处理后的源代码。
可以通过这个选项将预处理后的代码输出到标准输出或另一个文件中。
14.-S,只进行编译,生成汇编代码。
可以通过这个选项将汇编代码输出到标准输出或另一个文件中。
15. -shared,生成共享库文件。
这个选项可以用于生成可供其他程序调用的动态链接库。
16.-fPIC,生成位置无关的代码。
这个选项可以用于在共享库中使用。
17. -pthread,为多线程程序链接额外的线程库。
18. -march,指定目标处理器的架构。
例如,-march=armv7指定目标处理器是ARMv7架构。
19. -mfpu,指定使用的浮点单元类型。
GCC常用编译命令选项
GCC常⽤编译命令选项假设源程序⽂件名为main.c1. ⽆选项编译链接⽤法: gcc main.c作⽤: main.c预处理、汇编、编译并链接形成可执⾏⽂件。
这⾥未指定输出⽂件,默认输出为a.out。
2. 选项 –o⽤法:gcc main.c -o main.out作⽤:将main.c预处理、汇编、编译并链接形成可执⾏⽂件main.out。
-o选项⽤来指定输出⽂件的⽂件名。
3. 选项 –E⽤法:gcc -E main.c -o main.i作⽤:将 main.c预处理输出 main.i⽂件。
4. 选项 –S⽤法:gcc -S main.i作⽤:将预处理输出⽂件main.i汇编成main.s⽂件。
5. 选项 –c⽤法:gcc -c main.s作⽤:将汇编输出⽂件main.s编译输出main.o⽂件。
6. ⽆选项链接⽤法:gcc main.o -o main.out作⽤:将编译输出⽂件main.o链接成最终可执⾏⽂件main.out。
7. 选项-O⽤法:gcc -O1 main.c -o main.out作⽤:使⽤编译优化级别1编译程序。
级别为1~3,级别越⼤优化效果越好,但编译时间越长。
8.运⾏可执⾏⽂件⽤法:>>./main.out输出结果9.查看动态可执⾏⽂件动态库加载情况⽤法:>>ldd main.exe静态库后缀名⼀般为“.a”动态库后缀名⼀般为“.so”10.反汇编⽤法:objdump -d main.out⼆. 多源⽂件的编译⽅法假设有两个源⽂件为main.c和test.c1、多个⽂件⼀起编译⽤法:gcc main.c test.c -o main.out作⽤:将main.c和test.c分别编译后链接成main.out可执⾏⽂件。
2、分别编译各个源⽂件,之后对编译后输出的⽬标⽂件链接。
⽤法:gcc -c main.c //将main.c编译成main.ogcc -c test.c //将test.c编译成test.ogcc -o main.o test.o -o main//将main.o和test.o链接成main3、如果要编译的⽂件都在同⼀个⽬录下,可以⽤通配符gcc *.c -o 来进⾏编译。
GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项)[介绍]gcc and g 分别是gnu的c & c 编译器gcc/g 在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件汇编器as4.连接目标代码,生成可执行程序连接器ld1.总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码-S只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法gcc -S hello.c他将生成.s的汇编代码,你可以用文本编辑器察看-c只激活预处理,编译,和汇编,也就是他只把程序做成obj文件例子用法:gcc -c hello.c他将生成.o的obj文件2.目录选项-Idir在你是用#include'file'的时候,gcc/g 会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g 会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-include file-i相当于“#include”包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include例子用法:gcc hello.c -include /root/pianopan.h-I-就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir在-I的目录里面查找失败,讲到这个目录里面查找.-iprefix prefix-iwithprefix dir一般一起使用,当-I的目录查找失败,会到prefix dir下查找-Ldir制定编译的时候,搜索库的路径。
GCC编译优化选项
GCC编译优化选项-march第⼀个重要的选项是-march。
这个选项告诉编译器该为你的处理器(或arch)⽣成何种代码,它告诉编译器只为特定类型的CPU⽣成代码。
不同的CPU具有不同的能⼒,⽀持不同的指令集,以及不同的执⾏代码⽅式。
-march标记指⽰编译器根据你CPU的能⼒、特征、指令集、怪癖等⽣成特定的代码。
即使/etc/make.conf中的CHOST变量指定了所使⽤的通⽤构架,-march还是可以⽤来为特定的处理器优化程序。
x86和x86-64(也包括其他的)的CPU尤其应该利⽤-march标记。
-O接下来是-O变量。
这个选项控制所有的优化等级。
使⽤优化选项会使编译过程耗费更多的时间,并且占⽤更多的内存,尤其是在提⾼优化等级的时候。
-O设置⼀共有五种:-O0、-O1、-O2、-O3和-Os。
你只能在/etc/make.conf⾥⾯设置其中的⼀种。
除了-O0以外,每⼀个-O设置都会多启⽤⼏个选项,请查阅gcc⼿册的章节,以便了解每个-O等级启⽤了哪些选项及它们有何作⽤。
让我们来逐⼀考察各个优化等级:-O0:这个等级(字母“O”后⾯跟个零)关闭所有优化选项,也是CFLAGS或CXXFLAGS中没有设置-O等级时的默认等级。
这样就不会优化代码,这通常不是我们想要的。
-O1:这是最基本的优化等级。
编译器会在不花费太多编译时间的同时试图⽣成更快更⼩的代码。
这些优化是⾮常基础的,但⼀般这些任务肯定能顺利完成。
-O2:-O1的进阶。
这是推荐的优化等级,除⾮你有特殊的需求。
-O2会⽐-O1启⽤多⼀些标记。
设置了-O2后,编译器会试图提⾼代码性能⽽不会增⼤体积和⼤量占⽤的编译时间。
-O3:这是最⾼最危险的优化等级。
⽤这个选项会延长编译代码的时间,并且在使⽤gcc4.x的系统⾥不应全局启⽤。
⾃从3.x版本以来gcc的⾏为已经有了极⼤地改变。
在3.x,-O3⽣成的代码也只是⽐-O2快⼀点点⽽已,⽽gcc4.x中还未必更快。
最新GCC编译器选项及优化提示
G C C编译器选项及优化提示GCC编译器选项及优化提示GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握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="&&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,就不必解释了吧。
gcc编译参数
gcc编译参数在GCC中,编译参数用于指定编译器的行为和选项。
这些参数可以对代码进行优化、生成调试信息、链接不同的库等等。
以下是一些常用的GCC编译参数:1.优化参数:--O0:不进行优化--O1:进行基本优化--O2:进行更多优化--O3:进行最大优化--Os:进行优化以缩小代码尺寸2.调试参数:--g:生成调试信息- -ggdb:生成GDB可用的调试信息- -gdwarf:生成DWARF调试信息3.警告参数:- -Wall:开启所有警告- -Werror:将所有警告视为错误- -Wextra:开启额外的警告- -Wno-unused-parameter:忽略未使用的函数参数的警告4.标准库参数:- -std=c89:使用C89标准- -std=c99:使用C99标准- -std=c11:使用C11标准- -std=c++98:使用C++98标准- -std=c++11:使用C++11标准- -std=c++14:使用C++14标准- -std=c++17:使用C++17标准5.预处理参数:- -D<symbol>=<value>:定义宏- -U<symbol>:取消宏定义- -I<dir>:指定头文件路径6.链接参数:- -L<dir>:指定库文件路径- -l<library>:链接库文件- -shared:生成共享库- -static:生成静态库7.其他参数:--c:只编译,不链接- -o <output>:指定输出文件名- -Wl,<option>:传递选项给链接器- -Wp,<option>:传递选项给预处理器这只是一小部分常用的GCC编译参数,GCC还提供了许多其他参数用于更精细地控制编译过程。
可以通过运行`gcc --help`命令查看GCC支持的所有编译参数。
linux下gcc编译选项
linux下gcc编译选项(1)c/c++编译过程编译⼀个.cpp⽂件时,经过处理、编译、汇编和链接 4 个步骤,⽣成⼀个可执⾏程序:gcc编译过程1. 预处理:将(include)的⽂件插⼊原⽂件中、将宏定义展开、根据条件编译命令选择要使⽤的代码2. 编译:将预处理得到的源代码⽂件,进⾏“翻译转换”,⽣成汇编代码(编译阶段要检查代码的规范性、是否有语法错误,如函数、变量是否被声明等)3. 汇编:将汇编代码翻译成了机器码,表现为⼆进制⽂件4. 链接:将汇编⽣成的.o⽂件及其他函数库⽂件链接起来,⽣成能在特定平台上运⾏的可执⾏程序(在链接程序时,链接器会在所有的⽬标⽂件中找寻函数的实现。
如果找不到,那到就会报链接错误码(LinkerError))(2)gcc编译选项1. 常⽤命令选项1 --version 查看gcc版本号2 -std 指定C或C++语⾔标准版本。
⽐如 -std=c89,-std=c99等是C语⾔的标准版本号。
-std=c++11,-std=c++14等就是C++语⾔的标准版本号3 -o 指定输出⽂件,如果没有-o,输出有可能直接到stdout,有可能到默认的a.out⽂件4 -E 只做pre-process,预编译,要使⽤-o指定输出⽂件,此时⽂件⼀般都⽤.i结尾5 -S(⼤写)编译到(assembly)汇编,使⽤-o指定输出⽂件,此时⽂件⼀般都⽤.s结尾;6 -c 只编译,不链接,⽤-o指定输出⽂件,此时⽂件⼀般⽤.o结尾7 -g 附加debug信息,在输出的.o和可执⾏⽂件中,有很多.debug段。
(compile for debugging)8 -static⽤静态链接的⽅式编译,默认是动态链接,静态链接⽣产的⽂件体积会很⼤9 -shared ⽣成.so动态链接库10 -fPIC ⼀般在创建.so动态链接库的时候,都要加上-fPIC参数。
11 -fPIC 作⽤于编译阶段,告诉编译器产⽣与位置⽆关代码(Position-Independent Code),则产⽣的代码中,没有绝对地址,全12部使⽤相对地址,故⽽代码可以被加载器加载到内存的任意位置,都可以正确的执⾏。
gcc优化选项-O1-O2-O3-Os优先级
gcc优化选项-O1-O2-O3-Os优先级少优化->多优化:O0 -->> O1 -->> O2 -->> O3-O0表⽰没有优化,-O1为缺省值,-O3优化级别最⾼英⽂解析:`-O '`-O1 'Optimize. Optimizing compilation takes somewhat more time, and alot more memory for a large function.With `-O ', the compiler tries to reduce code size and executiontime, without performing any optimizations that take a great dealof compilation time.`-O ' turns on the following optimization flags:-fdefer-pop-fdelayed-branch-fguess-branch-probability-fcprop-registers-floop-optimize-fif-conversion-fif-conversion2-ftree-ccp-ftree-dce-ftree-dominator-opts-ftree-dse-ftree-ter-ftree-lrs-ftree-sra-ftree-copyrename-ftree-fre-ftree-ch-funit-at-a-time-fmerge-constants`-O ' also turns on `-fomit-frame-pointer ' on machines where doingso does not interfere with debugging.`-O ' doesn 't turn on `-ftree-sra ' for the Ada compiler. Thisoption must be explicitly specified on the command line to beenabled for the Ada compiler.`-O2 'Optimize even more. GCC performs nearly all supportedoptimizations that do not involve a space-speed tradeoff. Thecompiler does not perform loop unrolling or function inlining whenyou specify `-O2 '. As compared to `-O ', this option increasesboth compilation time and the performance of the generated code.`-O2 ' turns on all optimization flags specified by `-O '. It alsoturns on the following optimization flags:-fthread-jumps-fcrossjumping-foptimize-sibling-calls-fcse-follow-jumps -fcse-skip-blocks-fgcse -fgcse-lm-fexpensive-optimizations-fstrength-reduce-frerun-cse-after-loop -frerun-loop-opt-fcaller-saves-fpeephole2-fschedule-insns -fschedule-insns2-fsched-interblock -fsched-spec-fregmove-fstrict-aliasing-fdelete-null-pointer-checks-freorder-blocks -freorder-functions-falign-functions -falign-jumps-falign-loops -falign-labels-ftree-vrp-ftree-prePlease note the warning under `-fgcse ' about invoking `-O2 ' onprograms that use computed gotos.`-O3 'Optimize yet more. `-O3 ' turns on all optimizations specified by`-O2 ' and also turns on the `-finline-functions ',`-funswitch-loops ' and `-fgcse-after-reload ' options.`-O0 'Do not optimize. This is the default.///==================另外还有个Os选项==========================原来-Os相当于-O2.5。
简述gcc命令的选项
简述gcc命令的选项GCC是GNU Compiler Collection的缩写,是一款开源的编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。
GCC命令的选项非常多,可以根据不同的需求进行选择,下面将对GCC命令的选项进行简述。
1. 常用选项(1)-c:只编译不链接,生成目标文件。
(2)-o:指定输出文件名。
(3)-g:生成调试信息。
(4)-Wall:开启所有警告信息。
(5)-Werror:将警告信息视为错误。
(6)-O:优化选项,包括-O0、-O1、-O2、-O3等级别。
(7)-I:指定头文件搜索路径。
(8)-L:指定库文件搜索路径。
(9)-l:指定链接的库文件名。
2. 预处理选项(1)-E:只进行预处理,输出预处理结果。
(2)-D:定义宏。
(3)-U:取消定义宏。
(4)-I:指定头文件搜索路径。
(5)-M:输出依赖关系。
3. 编译选项(1)-S:只编译不汇编,生成汇编代码。
(2)-fPIC:生成位置无关代码。
(3)-fno-strict-aliasing:关闭严格别名规则。
(4)-fno-omit-frame-pointer:不省略函数栈帧指针。
(5)-fno-common:禁止共享数据段。
(6)-fno-builtin:禁用内建函数。
(7)-fno-stack-protector:禁用栈保护。
4. 链接选项(1)-shared:生成共享库。
(2)-static:生成静态库。
(3)-nostdlib:不使用标准库。
(4)-nodefaultlibs:不使用默认库。
(5)-Wl:传递参数给链接器。
(6)-rpath:指定运行时库搜索路径。
5. 其他选项(1)-v:显示编译器版本信息。
(2)-dumpversion:显示编译器版本号。
(3)-dumpmachine:显示编译器目标机器。
(4)-print-search-dirs:显示搜索路径。
(5)-print-libgcc-file-name:显示libgcc文件路径。
gcc 常用参数
gcc 常用参数(实用版)目录1.概述2.常用参数分类2.1 编译选项2.2 链接选项2.3 运行选项3.编译选项示例3.1 输出文件3.2 优化3.3 调试4.链接选项示例4.1 库文件4.2 目标文件5.运行选项示例6.总结正文1.概述GCC(GNU Compiler Collection)是一个开源的编译器套件,支持多种编程语言,如 C、C++、Fortran 等。
GCC 提供了丰富的编译参数,可以根据需求灵活调整编译、链接和运行过程。
本文将介绍 GCC 的常用参数。
2.常用参数分类2.1 编译选项- 输出文件:-o 或 -o output_file,指定编译后输出文件。
- 优化:-O 或 -O2 或 -O3,分别表示优化程度从低到高的优化选项。
- 调试:-g,添加调试信息,便于调试程序。
- 编译语言:-x language,指定源文件的编程语言,如 -x c 或-x c++。
2.2 链接选项- 库文件:-l library_name,链接指定的库文件。
- 目标文件:-m,链接目标文件。
- 库目录:-Wl,-rpath,library_directory,指定库文件的目录。
2.3 运行选项- 运行程序:./output_file,运行编译后的程序。
- 运行参数:arg1 arg2 arg3,传递给程序的命令行参数。
3.编译选项示例- 输出文件:gcc -o example.out source.c,将源文件 source.c 编译为名为 example.out 的输出文件。
- 优化:gcc -O2 source.c,对源文件 source.c 进行优化编译。
- 调试:gcc -g source.c,为源文件 source.c 添加调试信息。
4.链接选项示例- 库文件:gcc -o example source.c -lmylib,链接名为 mylib 的库文件。
- 目标文件:gcc -o example source1.o source2.o,链接源文件 source1.c、source2.c 和目标文件 output.o。
如何利用编译器选项优化代码性能(九)
代码的性能优化一直是开发者关注的重要话题。
而编译器选项作为一种可供利用的工具,可以帮助开发者对代码进行优化,提升程序的性能。
本文将会讨论如何利用编译器选项来优化代码性能,并介绍一些常见的编译器选项以及其作用。
一、选择合适的编译器选项选择合适的编译器选项是优化代码性能的第一步。
不同的编译器选项具有不同的作用,可以针对不同的代码进行优化。
下面是一些常见的编译器选项及其作用:1. -O0/-O1/-O2/-O3:这是GCC编译器提供的一系列优化级别选项。
-O0代表禁用所有优化,-O1代表基本优化,-O2代表常见的优化,-O3则代表更多的优化。
一般情况下,建议使用-O2级别的优化。
2. -march=native:这个选项可以让编译器根据当前的系统架构来进行优化。
对于不同的处理器架构,编译器可以针对性地生成更优化的机器指令。
3. -funroll-loops:这个选项可以让编译器执行循环展开优化,即将循环体中的代码展开成多次循环执行的代码。
这样可以减少循环的迭代次数,从而提高代码的执行速度。
4. -ftree-vectorize:对于合适的代码,这个选项可以让编译器进行向量化优化。
通过将多个数据操作合并成一个向量操作,可以提高代码的并行度,从而加快程序的执行速度。
二、针对性地优化代码除了选择合适的编译器选项外,开发者还可以针对性地优化代码,使其更适应编译器的优化。
下面是一些常见的针对性优化方法:1. 减少函数调用:函数调用会带来一定的开销,尤其是在循环中频繁调用的函数。
可以通过将函数的实现直接内联到调用位置来减少函数调用的开销。
2. 减少内存访问:内存访问是程序性能的瓶颈之一,可以通过减少对内存的频繁访问来提升代码性能。
例如,可以将循环中的数组访问拆分成多个独立的循环,以减少对内存的频繁访问。
3. 使用更高效的数据结构和算法:选择适合问题的数据结构和算法,可以大大提升代码的执行效率。
比如,使用哈希表代替线性查找,使用快速排序代替冒泡排序等。
GCC -o 优化选项说明
GCC编译器优化选项分析及具体优化了什么收藏起因:目前项目使用nios IDE作为开发平台,其使用的编译器为gcc的交叉编译器。
在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下会出现LCD显示的开端显示不全,缺少一个字节或字的状况。
为了了解具体为什么造成该问题,对两种模式下的配置做了对比,编译器皆为nios2-elf-gcc交叉编译器,debug模式编译器参数为:-DALT_DEBUG -O0 -g –Wall。
release模式编译器参数为: -DALT_RELEASE -O2 -g –Wall。
两种模式下的参数简单说明如下-DALT_DEBUG:目前没有明确资料显示该项的具体作用,根据命名可认为与调试有关选项。
且两种模式下都有,暂时认为不会造成差异。
-O0: gcc编译器默认优化等级。
-g:gdb调试器支持选项用于在编译时生成相关调试信息。
-Wall:打开所有编译器告警选项,即编译器最严格告警模式。
-O2:gcc编译高于O0低于O3的编译优化选项。
通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?是否由这些问题造成的显示丢失问题那??现在我们来看看gcc编译器的优化参数到底做了什么优化。
(注:由于关于nios2-elf-gcc的文档资料十分稀少,不能形成可分析的文档,所以以通用的gcc作为分析,毕竟同出一源)正文:GCC编译器优化选项介绍:GCC编译器在目前是不是用最多的编译器也相去不远,尤其在嵌入式领域很多编译器都是基于GCC的cross gcc版本。
毕竟功能成熟而且有开放的源代码。
这里只介绍优化编译的参数-O用来开启优化编译选项。
-O0:默认模式,不做任何优化。
-O1:优化。
该模式下对于一个大的函数或功能会花费更多的时间和内存。
在-O1下:编译会尝试减少代码体积和代码运行时间。
但是并不执行会花费大量时间的优化操作。
一GCC编译的详细参数以及动态库和静态库的制作
一GCC编译的详细参数以及动态库和静态库的制作GCC是一个开源的编程语言编译器套件,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Java和Ada。
GCC提供了非常丰富的编译选项,可以根据编译的需要进行配置。
下面是一些常用的GCC编译选项:1.优化选项:--O0:不进行优化。
--O1:进行基本优化,可以提高代码运行速度。
--O2:进行更多的优化,会消耗更多的编译时间。
--O3:进行更深入的优化,可能会改变代码的行为。
2.调试选项:--g:生成调试信息,可以在调试器中使用。
- -ggdb:生成与GDB调试器兼容的调试信息。
- -gdwarf:生成与DWARF调试格式兼容的调试信息。
3.目标选项:- -march:指定生成的目标架构。
- -mtune:指定优化的目标处理器。
- -mlittle-endian:生成小端字节顺序的代码。
4.头文件和库文件选项:- -I <directory>:指定头文件路径。
- -L <directory>:指定库文件路径。
- -l <library>:链接指定的库文件。
动态库和静态库的制作涉及到将一组源代码文件编译成可执行代码的过程。
GCC提供了多个选项来控制动态库和静态库的制作。
静态库是一组目标文件的归档文件,可以通过GCC的ar命令创建。
下面是一些常用的选项:--c:编译源代码文件成为目标文件。
- ar rcs <library_name> <object_files>:将多个目标文件归档成一个静态库。
- -l <library_name>:链接指定的静态库。
动态库是一组在运行时加载的共享目标文件,可以通过GCC的共享链接器选项创建。
下面是一些常用的选项:--fPIC:产生与位置无关的代码。
- -shared:创建共享目标文件。
- -Wl,-soname,<library_name>:指定动态库的名称。
GCC编译选项参数
GCC编译选项参数GCC是一种开源的编译器套件,可用于编译多种编程语言,例如C、C++、Objective-C、Fortran等。
GCC提供了许多编译选项参数,以便开发人员根据需要自定义编译过程。
以下是一些常用的GCC编译选项参数。
1. -o filename:指定输出文件的名称,例如gcc -o myprogram.c。
2.-c:仅编译源文件,生成相应的目标文件,而不进行链接操作。
3.-E:仅进行预处理,输出预处理后的源代码。
4.-S:仅进行编译,生成汇编语言代码。
5.-g:生成调试信息,以便在调试程序时使用调试器。
6. -O[level]:优化编译,提高程序执行效率。
级别有-O0(关闭优化)、-O1(开启基本优化)、-O2(开启更多优化)、-O3(开启所有优化)等。
7. -Wall:输出所有警告信息。
8. -Werror:将所有警告信息视为错误,编译过程中出现警告将中断编译。
9. -std=标准:指定使用的语言标准,例如-std=c9910. -I directory:指定头文件的路径,可以使用多个-I选项来指定多个路径。
11. -L directory:指定库文件的路径,可以使用多个-L选项来指定多个路径。
12. -l library:链接指定的库文件,例如-lm表示链接数学库。
13. -D macro:定义一个宏,可以使用-D选项定义多个宏。
14. -U macro:取消一个宏的定义。
15. -pedantic:严格按照标准执行,当代码使用了标准不允许的特性时给出警告。
16. -Werror-implicit-function-declaration:函数未声明时,将其视为错误。
17. -Wno-unused-variable:忽略未使用的变量警告。
18.-fPIC:生成位置无关代码,用于生成共享库。
19. -march=architecture:指定目标架构,例如-march=native表示使用当前机器的最佳指令集扩展。
【GCC】gcc警告选项汇总--编辑中gcc编译选项
【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。
英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。
-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。
-w (⼩写)禁⽌所有警告消息。
-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。
-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。
-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。
在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。
gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。
请注意,指定-Werror = foo会⾃动隐含-W foo 。
但是, -Wno-error = foo并不意味着什么。
反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。
这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。
但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。
警惕arm-linux-gcc编译器优化选项
警惕arm-linux-gcc编译器优化选项arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执⾏效率更⾼。
但是,倘若我们就是需要程序慢⼀点运⾏,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的。
有时候,我们需要事物差的⼀⾯。
下边的代码是我的main.c程序。
#define GPBCON (*(volatile unsigned long *)0x56000010)#define GPBDAT (*(volatile unsigned long *)0x56000014)#define GPB5_out (1<<(5*2))#define GPB6_out (1<<(6*2))#define GPB7_out (1<<(7*2))#define GPB8_out (1<<(8*2))void wait(unsigned long dly){for(; dly > 0; dly--);}int main(void){unsigned long i = 0;GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出while(1){wait(30000);GPBDAT = (~(i<<5)); // 根据i的值,点亮LED1-4if(++i == 16){i = 0;}}return0;} 这部分程序使⽤优化选项(-O2)编译的,编译后的汇编程序如下所⽰。
0000001c <wait>:1c: e12fff1e bx lr00000020 <main>:20: e92d4010 stmdb sp!, {r4, lr}24: e3a03b55 mov r3, #87040; 0x1540028: e3a04456 mov r4, #1442840576; 0x560000002c: e59f0060 ldr r0, [pc, #96] ; 94 <.text+0x94>30: e5843010 str r3, [r4, #16]34: ebfffff8 bl 1c <wait>38: e3e03000 mvn r3, #0; 0x03c: e59f0050 ldr r0, [pc, #80] ; 94 <.text+0x94>40: e5843014 str r3, [r4, #20]44: ebfffff4 bl 1c <wait>48: e3e03020 mvn r3, #32; 0x204c: e5843014 str r3, [r4, #20]50: e59f003c ldr r0, [pc, #60] ; 94 <.text+0x94>54: ebfffff0 bl 1c <wait>58: e3e03040 mvn r3, #64; 0x405c: e3a01003 mov r1, #3; 0x360: e5843014 str r3, [r4, #20]64: e1a04001 mov r4, r168: e59f0024 ldr r0, [pc, #36] ; 94 <.text+0x94>6c: ebffffea bl 1c <wait>70: e2841001 add r1, r4, #1; 0x174: e1a03284 mov r3, r4, lsl #578: e1e03003 mvn r3, r37c: e3a02456 mov r2, #1442840576; 0x5600000080: e3510010 cmp r1, #16; 0x1084: e5823014 str r3, [r2, #20]88: e3a04000 mov r4, #0; 0x08c: 1afffff4 bne 64 <main+0x44>90: eafffff4 b 68 <main+0x48>94: 00007530 andeq r7, r0, r0, lsr r5 可以看到,我们的延时函数完全被优化的没有了,那么我们的延时函数还有什么⽤。
gcc常用编译选项
gcc常⽤编译选项完整的gcc详解可以参见。
“-Wall”选项打开所有最常⽤到的编译警告,强烈建议打开,可以捕捉到许多在C编程中最常发⽣的错误。
“-o”选项来为可执⾏⽂件指定⼀个不同的输出⽂件。
“-c”⽤于把源码⽂件编译成对象⽂件。
对象⽂件包含的是机器码,其中任何对在其他⽂件中的函数(或变量)的内存地址的引⽤都留着没有被解析。
这样就允许在互相之间不直接引⽤的情况下编译各个源代码⽂件。
链接器在⽣成可执⾏⽂件时会填写这些还缺少的地址,然后把所有的对象⽂件组合在⼀起⽣成单个的可执⾏⽂件。
当⽤“-c”来编译时,编译器会⾃动⽣成与源⽂件同名,但⽤“.o”来代替原来的扩展名的对象⽂件。
gcc使⽤链接器ld来施⾏链接,它是⼀个单独的程序。
在GNU系统上⽤到的是GNU的链接器,即GNU ld。
通常,链接要快于编译----在⼀个有许多源⽂件的⼤型项⽬中,只重新编译那些被修改过的⽂件可以显著地节省时间。
仅仅重编译项⽬中修改过的⽂件的过程可以⽤GNU Make来⾃动完成。
标准的系统库通常能在“/usr/lib”和“/lib”⽬录下,C标准库⾃⾝存放在“/usr/lib/libc.a”中,包含ANSI/ISO C标准指定的各个函数。
其他库都需要显⽰或隐⽰指定。
“-lNAME”试图链接标准库⽬录下的⽂件名为“libNAME.a”中的对象⽂件。
在⼤型程序中通常会⽤到很多“-l”选项,来链接象数学库,图形库和⽹络库。
使⽤选项“-lNAME”的情况下,静态库“libNAME”可以⽤于链接,但编译器⾸先会检查具有相同名字和“.so”为扩展名的共享库。
默认情况下,载⼊器仅在⼀些预定义的系统⽬录中查找共享库,⽐如“/usr/local/lib”和“/usr/lib”。
如果库不在这些⽬录中,那它必须被添加到载⼊路径(load path)中去。
设置载⼊路径的最简单⽅法是通过环境变量LD_LIBRARY_PATH。
“-static”选项可以迫使gcc静态链接,避免使⽤共享库。
gcc编译选项分析
小知识
可以看出,该选项并没有发现”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)优化选项。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GCC编译器选项及优化提示GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握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="&&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的功能又关闭函数内嵌功能。
更多的优化选项请参见:所有GCC选项完整列表参见:有两个页面值的参考:(对于gentoo-1.4)比较安全的优化选项(对于gentoo-1.4)进阶优化选项*哦,忘了说一声,"-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指定gcc将要运行的版本。
只有在安装了多个版本gcc的机器上才有效。
-ansi按照ANSI标准编译程序,但并不限制与标准并不冲突的GNU扩展(一般不用该选项)-pedantic如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)-std=指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline(一般不用该选项)-static连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。
-shared连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。
如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。
为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。
-shared-libgcc该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。
-specs=gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。
该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。
-pipe使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。
建议使用。
-o指定输出文件,对各种输出皆有效。
由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。
--help显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。
--target-help显示目标机器相关的命令行选项列表-b指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。
目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib//-B指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。
这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。
-I指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。
-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必须将数值复制到寄存器中才能对他们进行运算。
由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。