在本章中,Scott Meyer 提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,主要目标是避免重新编译 cpp 文件。
我的问题是:
在我过去的项目中,我从未关注过这条规则。编译时间不短但也不是不能忍受。这可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如 clang),今天这个技巧有多实用?
我在哪里可以找到更多使用这种技术的例子?(例如 Gnome 或其他 OSS 项目)
PS我使用的是第二版。
在本章中,Scott Meyer 提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,主要目标是避免重新编译 cpp 文件。
我的问题是:
在我过去的项目中,我从未关注过这条规则。编译时间不短但也不是不能忍受。这可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如 clang),今天这个技巧有多实用?
我在哪里可以找到更多使用这种技术的例子?(例如 Gnome 或其他 OSS 项目)
PS我使用的是第二版。
我不认为编译器技术特别先进。clang 并不是什么神奇的东西——如果你有依赖然后你做了改变,那么依赖的代码将不得不重新编译。这可能需要非常非常长的时间——对于一个大型项目来说,阅读数小时甚至数天,因此人们会尽量减少这种依赖关系。
话虽如此,有可能做的太多了——把所有的类都变成 PIMPL,前向声明一切,等等。这样做只会导致代码混淆,应该尽可能避免。
减少编译时间是一条红鲱鱼,也是过早优化的一种形式。可以重新组织代码以减少编译时间(当这很重要时),但代价很高。
至于 Gnome,Gnome 在每个 GObject 中都有一个“私有指针”。这实现了 pimpl 习惯用法。这减少了源文件之间的依赖关系,并允许某种形式的封装。C 项目的编译时间问题较少。
现代 C++ 设计大量使用模板,这不可避免地使您的编译时间飞速增长。使用 pimpl 习惯用法和前向声明类(而不是在可能的情况下包含标头)减少了翻译单元之间的逻辑依赖性(这是一件好事),但在许多情况下并不能真正帮助缩短编译时间。
使用boost
会大大增加编译时间(请注意,如果您在许多源文件中间接包含 boost 头文件),并且许多 C++ 项目都使用它。
我还应该提到瘦模板习惯用法通常用于减少模板的代码膨胀。