有效的C ++“35。最小化文件之间的编译依赖性”。它今天仍然有效吗?

时间:2011-06-12 11:28:24

标签: c++ header dependencies effective-c++

在本章中,Scott Meyer提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,则主要目标是避免重新编译cpp文件。

我的问题是:

  • 在我过去的项目中,我从未关注过这条规则。编译时间不短,但不能容忍。它可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如clang),今天这个技巧有多实用?

  • 我在哪里可以找到更多使用这种技术的例子? (例如Gnome或其他OSS项目)

P.S。我正在使用第2版。

2 个答案:

答案 0 :(得分:14)

我认为编译器技术并没有特别进步。 clang不是一些魔法 - 如果你有依赖关系然后你做了更改,那么必须重新编译依赖代码。这可能需要非常长的时间 - 大型项目的阅读时间甚至数天,因此人们会尽可能减少这种依赖性。

话虽如此,有可能过度使用 - 将所有类转换为PIMPL,转发声明所有内容等。这样做只会导致代码混淆,应尽可能避免使用。

答案 1 :(得分:14)

减少编译时间是一种红色鲱鱼,是一种过早优化的形式。重新组织你的代码以减少编译时间(当这很重要时)可以完成,但是花费很多。

对于Gnome,Gnome在每个GObject中都有一个“私有指针”。这实现了pimpl习语。这减少了源文件之间的依赖关系,并允许某种形式的封装。 C项目的编译时问题较少。

现代C ++设计大量使用模板,这不可避免地使您的编译时间飙升。使用pimpl习惯用法并转发声明类(而不是在可能的情况下包括标题)可以减少翻译单元之间的逻辑依赖关系(这是一件好事),但在许多情况下对编译时间没有帮助。

使用boost会大大增加编译时间(请注意,如果在许多源文件中间接包含boost标头),许多C ++项目都会使用它。

我还应该提一下,瘦模板习惯用法通常用于减少模板的代码膨胀。