问题描述
|
在这一章中,Scott Meyer提到了一些避免头文件依赖的技术。如果更改仅限于其他随附的头文件,则主要目标是避免重新编译cpp文件。
我的问题是:
在我过去的项目中,我从未关注过此规则。编译时间不短,但也不容忍。这可能与我项目的规模(或缺乏)有关。鉴于编译器技术(例如clang)的发展,今天的技巧实用性如何?
在哪里可以找到使用此技术的更多示例? (例如Gnome或其他OSS项目)
附言我正在使用第二版。
解决方法
我认为编译器技术没有特别先进。 clang并不是什么神奇的东西-如果您具有依赖关系然后进行更改,则必须重新编译依赖的代码。对于一个大型项目,这可能会花费非常非常长的时间-数小时甚至是数天,因此人们尝试尽可能地减少这种依赖性。
话虽这么说,但有可能做得过多:将所有类都制作成PIMPL,转发声明所有内容,等等。这样做只会导致代码混乱,应尽可能避免。
, 减少编译时间是一个麻烦,也是过早优化的一种形式。可以对代码进行重组以减少编译时间(在此情况下很重要),但是要付出一定的代价。
至于Gnome,Gnome在每个GObject中都有一个“专用指针”。这实现了pimpl习惯用法。这样可以减少源文件之间的依赖性,并允许某种形式的封装。 C项目的编译时间问题较少。
现代C ++设计大量使用模板,这不可避免地使您的编译时间猛增。使用pimpl习惯用法和前向声明类(在可能的情况下,不包括标头)可以减少翻译单元之间的逻辑依赖关系(这是一件好事),但是在许多情况下,编译时间实际上并没有帮助。
使用ѭ0会大大增加编译时间(请注意,如果您间接在许多源文件中包含boost标头),并且许多C ++项目都使用它。
我还应该提到瘦模板习惯用法,通常用于减少模板的代码膨胀。