C++模块:模块实现单元进行不必要的重新编译?



>最近观看的CppCon 2017视频:Boris Kolpackov"Building C++ Modules" https://www.youtube.com/watch?v=E8EbDcLQAoc

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

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

而且我一点也不喜欢。听起来我们仍然处于90年代,编译器不够聪明,无法看到与BMI相关的变化和与实现相关的变化的差异。在我看来,编译器能够快速扫描每个模块并从中仅生成BMI。如果 BMI 没有改变 - 不要重新编译依赖于它的其他模块。

还是我错过了什么?

那次演讲的作者后来说,重新编译问题是一个实现问题。引用鲍里斯·科尔帕科夫(Boris Kolpackov)的文章Common C++ Module TS Misconceptions

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

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

引用Gor Nishanov(Coroutines TS的项目编辑器)来自链接线程:

这取决于你如何构建你的代码。模块 TS 不会强制您如何将模块分解为单个文件。如果需要,可以在接口文件中实现整个模块(因此您将拥有类似 C# 的经验),也可以将模块分区为接口和一个或多个实现文件。

模块TS的项目编辑Gabriel Dos Reis评论了MSVC的实现:

理想情况下,只有与语义相关的更改才能触发以 IFC 为键的重新编译。

(作为旁注,模块 TS 现已获得批准并发送给 ISO 进行发布。

最新更新