降低编译时间的几条方法
关于include的原则最多,因为包含头文件相当于将代码复制到本文件来编译,而头文件又经常是用来被别人包含的,所以工程文件多了,每个文件都有include链(包含的文件又include了其他文件),该链条不会止步于你工程,而会延伸到你所有使用的第3方库里面。 A.能够去掉的include就去掉。 说明:1.代码编写过程中或多或少都有一些历史遗留的不必要的头文件包含在你的文件里面,找到他们并去掉之。 2.去掉include链里面重复的include 。 B.能够在cpp里面include的头文件不要在头文件里面include。 说明:尽量去掉每个cpp会被串起来的头文件膨胀的机会。 C.能够用前向声明的就不要include,头文件里面也是一样 说明:在头文件里面用前向声明然后保存指针或者引用,在具体实现的cpp里面再包含头文件,虽然看起来和《C++ coding Standards》“Make header files self-sufficient”有些冲突,但是在一些核心的.h(被很多类include的)里面作改造工作,还是能够收到很大的降低编译时间效果,而付出的代价就是原来只需要包含该头文件就可以编译成功的cpp需要额外包含一些头文件。 举个例子: Foo类头文件使用了前向申明保存了A类和B类的指针或者引用为成员变量,在Foo类的cpp里面才包含A和B的头文件,而当C类需要使用Foo类时候包含Foo类的头文件,但是操作中又需要调用A的成员函数,C不同时包含A的头文件的花就会出现编译失败。 虽然表面上是让代码更加复杂了,但是除却带来降低编译时间的好处之外,代码也在强迫你进行解耦合,如果说你cpp里面需要包含的头文件越多,说明你这个类需要知道的对象就越多,你可以乘机检查一下自己的代码又没有不必要的耦合,为什么这个cpp需要知道那么多的本来可能属于别的类的细节..... D.把大多数模块都要使用的库文件或者稳定类的头文件include放到预编译头文件“stdafx.h”里面 说明:由于预编译头文件里面include的内容只会compile一次而被link多次,把一些常用类放到这里会降低很多编译时间,但也不能乱来,要点在于 “大多数”和“稳定”,如果一个头文件经常变化,他的一次小改动都会引起整个工程rebuild,哪怕只是一个注释,因为所有的cpp文件都包含了stdafx.h而stdafx.h又包含了这个容易变动的头文件。 E.使用Pimpl惯用法 说明:关于Pimpl大家可以查下资料,《C++ coding Standards》里面也有讲解,基本上就是采用一个私有的前向申明的stuct指针把所有protect成员都封装起来起来.基本上是一个最终极的解决方案,但是对我们现有架构改造太大,不敢全面实行,我们只选择了数个最有价值的类进行了改造,打算以后在其他项目里面再全面应用。 |