c++编译模型


C++编译特点

  • 与C兼容

不仅是语法兼容,更重要的是兼容C语言的编译模型与运行模型,也就是能直接使用 C语言的头文件。

  • C++语言的三大约束

与C兼容,零开销,值语义。


 

单遍编译,C++继承了C的单遍编译,但是影响了名字查找和函数重载决议。从头到尾扫描一遍源码,一边解析源码,一边生成目标代码,也就是编译时,只能看到目前已经解析过的源码,看不到后面的源码,也是C语言中需要函数声明的原因。结构体必须先定义。 

重载,为了实现函数重载,c++编译器采用名字改编的办法,为每个重载函数生成独一无二的名字,这样链接的时候就能找到正确的函数。返回类型不参与函数重载。函数重载决议,当C++编译器读到一个函数调用时,它必须从已经看到的同名函数中选出最佳的函数,哪怕后面出现了更合适的匹配。

C++ 只能通过解析源码来了解名字的含义。意味着要准确理解一行代码的意义,需要通读之前的所有代码。AA BB(CC);这句话既可以声明函数,也可以定义变量,代码的行为跟AA BB的完整定义有关。

 

编译过程

编译的步骤

preprocessor    /complier    /assembler    /linker

1.      每个源文件作为一个编译单元,可能会包含上百甚至上千个头文件。每一个编译单元,这些头文件都会被从硬盘读进来一遍,然后被解析一遍。

2.      每个编译单元都会产生一个obj文件,然后所以这些obj文件会被link到一起。

 

一个C++可执行文件是debug build 还是 release build?通常的做法是判断class template 的短函数成员有没有被inline展开。

g++ -Wall *.cc 没有优化的bulid,不会inline展开。debugbuild.

g++ -Wall -o2 *.cc inline展开。releasebuild. 编译器自动生成的析构函数也是inline的。

 

编译的结果是静态库,动态库,或程序。

1、  一致的内存管理,Linux共享库与应用程序共享一个heap,因此动态库分配的内存可以交给应用程序去释放。

2、  一致的初始化,动态库里的静态对象的初始化和程序其他地方的静态对象一样。

3、  在动态库中可以放心使用class, STL。

 

由于C++ 的头文件与源文件分离,并且目标文件里没有足够的元数据供编译器使用,因此必须同时提供库文件和头文件。也就是说要想使用一个已经编译好的C/C++ 库(无论是静态库还是动态库),我们需要两样东西,一是头文件(.h),二是库文件(.a 或.so),这就存在了两样东西不匹配的可能。

如果替换了某个程序用到的动态库,先前运行正常的这个程序使用的将不再是当初build 和测试时的代码。结果是程序的行为变得不可预期。

一旦动态库或静态库可能频繁更新,为了避免头文件和库文件不一致,建议直接使用库源代码。这样彻底避免头文件与库文件之间的时间差,也不用为库的版本搭配操心。这么做的缺点是编译时间很长。

 

编译加速

1.        在头文件中使用前置声明,而不是直接包含头文件。

很多时候前置声明某个namespace中的类会比较痛苦,而直接include会方便很多,千万要抵制住这种诱惑;类的成员,函数参数等也尽量用引用,指针,为前置声明创造条件。

2.        高度模块化

不要把两个不相关的类,或者没什么联系的宏定义放到一个头文件里。内容要尽量单一,从而不会使包含他们的文件包含了不需要的内容。代码中最"hot"的那些头文件找出来,然后分成多个独立的小文件,效果相当可观。

3.        特别注意inline和template

这是C++中两种比较"先进"的机制,但是它们却又强制我们在头文件中包含实现。

4.        不要有太多的AdditionalInclude Directories

编译器定位你include的头文件,是根据你提供的include directories进行搜索的。

5.        并行编译和更好的磁盘

CPU有8核的,每次一build,就是8个文件并行着编。编译速度慢很大一部分原因是磁盘操作。make的-j参数可以使make进行并行编译。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值