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

Ant*_*ong 14 c++ dependencies header effective-c++

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

我的问题是:

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

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

PS我正在使用第2版.

小智 14

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

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

  • +1.从某种意义上说,使用C++ + SWIG +其他工具,编译器技术已经退回到计算的石器时代(至少就构建时间而言).几小时甚至几天的建设时间是大型项目的新现实. (2认同)

Ale*_* C. 14

减少编译时间是一种红色鲱鱼,是一种过早优化的形式.重新组织代码以减少编译时间(当这很重要时)可以完成,但是以某种方式付出了巨大代价.

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

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

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

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

  • 我觉得你也给了一个很好的答案.希望我能接受不止一个答案 (2认同)