C ++模块:模块实现单元,用于不必要的重新编译?

时间:2018-01-17 17:21:21

标签: c++ compilation c++-modules

最近观看了CppCon 2017的视频:Boris Kolpackov“构建C ++模块” https://www.youtube.com/watch?v=E8EbDcLQAoc

大约在31:35他开始解释我们仍然应该使用标题/源分裂并显示3个原因。第一个原因:

如果您在触摸此模块时在同一位置同时具有两个声明/定义,则将重新编译依赖于模块接口(BMI)的所有其他模块。

我完全不喜欢。这听起来像我们仍然在90年代,编译器不够聪明,看不出与BMI相关的变化和实现相关的变化。在我看来,编译器能够快速扫描每个模块并从中生成BMI。如果BMI没有改变 - 不要重新编译依赖它的其他模块。

或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

该演讲的作者后来表示重新编译问题是一个实施问题。引用Boris Kolpackov撰写的文章Common C++ Modules TS Misconceptions

  

事实证明,很多人想摆脱标题/源分割(或者,在模块术语中,接口/实现拆分)并将所有内容保存在单个文件中。您可以在模块TS中执行此操作:使用模块(与标头不同),您可以在模块接口单元中定义非内联函数和变量。因此,如果您想将所有内容保存在单个文件中,则可以

  

现在,将所有内容保存在单个文件中可能会对构建性能产生负面影响,但似乎与编译器合作的足够聪明的构建系统应该能够克服这一点。有关详细信息,请参阅此discussion

从链接的帖子中引用Gor Nishanov(Coroutines TS的项目编辑):

  

由您决定如何构建代码。模块TS不会强制您将模块分解为单个文件。如果需要,可以在界面文件中实现整个模块(因此您将获得类似C#的体验),或者您可以将模块划分为一个接口和一个或多个实现文件。

Modules TS项目编辑,Gabriel Dos Reis,commented on the MSVC implementation

  

理想情况下,只有与语义相关的更改才会触发在IFC上键入的重新编译。

(作为旁注,模块TS has now been approved并发送给ISO进行发布。)