在本章中,Scott Meyer提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,则主要目标是避免重新编译cpp文件。
我的问题是:
在我过去的项目中,我从未关注过这条规则。编译时间不短,但不能容忍。它可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如clang),今天这个技巧有多实用?
我在哪里可以找到更多使用这种技术的例子? (例如Gnome或其他OSS项目)
P.S。我正在使用第2版。
答案 0 :(得分:14)
我认为编译器技术并没有特别进步。 clang不是一些魔法 - 如果你有依赖关系然后你做了更改,那么必须重新编译依赖代码。这可能需要非常长的时间 - 大型项目的阅读时间甚至数天,因此人们会尽可能减少这种依赖性。
话虽如此,有可能过度使用 - 将所有类转换为PIMPL,转发声明所有内容等。这样做只会导致代码混淆,应尽可能避免使用。
答案 1 :(得分:14)
减少编译时间是一种红色鲱鱼,是一种过早优化的形式。重新组织你的代码以减少编译时间(当这很重要时)可以完成,但是花费很多。
对于Gnome,Gnome在每个GObject中都有一个“私有指针”。这实现了pimpl习语。这减少了源文件之间的依赖关系,并允许某种形式的封装。 C项目的编译时问题较少。
现代C ++设计大量使用模板,这不可避免地使您的编译时间飙升。使用pimpl习惯用法并转发声明类(而不是在可能的情况下包括标题)可以减少翻译单元之间的逻辑依赖关系(这是一件好事),但在许多情况下对编译时间没有帮助。
使用boost
会大大增加编译时间(请注意,如果在许多源文件中间接包含boost标头),许多C ++项目都会使用它。
我还应该提一下,瘦模板习惯用法通常用于减少模板的代码膨胀。