gcc选项(二)

g++和gcc的区别

  GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
  gcc:是GCC中的GUN C Compiler(C 编译器)
  g++:是GCC中的GUN C++ Compiler(C++编译器)
  一个有趣的事实就是,就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,比如,用gcc编译一个c文件的话,会有以下几个步骤:
  Step1:Call a preprocessor, like cpp.
  Step2:Call an actual compiler, like cc or cc1.
  Step3:Call an assembler, like as.
  Step4:Call a linker, like ld.
  由于编译器是可以更换的,所以gcc不仅仅可以编译C文件,所以,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler。
  gcc和g++的主要区别:

  1. 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  2. 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  4. gcc在编译C文件时,可使用的预定义宏是比较少的
  5. gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
  1. 在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个。

  连接:
  g++和gcc的区别:https://blog.csdn.net/minld/article/details/72599575

优化选项

  gcc默认提供了5级优化选项的集合:
  -O0:无优化(默认)。
  -O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。在编译大型程序的时候会显著增加编译时内存的使用和时间。
  -O2: 此选项将增加编译时间和目标文件的执行性能。
包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。
编译器不执行循环展开以及函数内联。
  -Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项,并且执行专门减小目标文件大小的优化选项。
  -O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload and -ftree-vectorize优化选项。

-O1

   o1是最基本的优化,主要对代码的分支,表达式,常量来进行优化,编译器会在较短的时间下将代码变得更加短小,这样体积就会变得更小,会减少内存的占用率,在操作系统进行内存调度时就会更快。但是事情没有绝对的优点,当一个庞大的程序被拆碎细分的话,内存占用会大大增加,由于当今系统大多数都是多线程,就会出现卡顿和反应延迟。
  当在机子上,运行无法干涉到调试时,-O选项也会添加-fomit-frame-pointer选项。在ADA编译器上,-O不会添加-ftree-sra选项,想在ADA编译器下使用该选项,必须明确的在命令行指出。
  链接:
  Gcc优化选项:https://blog.csdn.net/zhang626zhen/article/details/52988242
  GCC优化选项的各种含义以及潜藏风险:https://blog.csdn.net/findaway123/article/details/41752857

猜你喜欢

转载自blog.csdn.net/essity/article/details/82944115