【问题标题】:C++ modules: module implementation units for unnecessary recompilation?C ++模块:不必要的重新编译的模块实现单元?
【发布时间】:2018-01-17 17:21:21
【问题描述】:

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

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

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

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

还是我错过了什么?

【问题讨论】:

  • 这是一个完整的工具实现细节。大多数构建系统都很简单,并且依赖文件的时间戳来决定需要编译的内容。但这很容易得到改进,正如过去 10 年大家最喜欢的 C++ language extension 所证明的那样。
  • 这将是实现细节,但如果它影响整个模块提案,那么它不是。前段时间我的印象是 C++ 模块看起来像 Java 或 C# 模块 - 每个模块 1 个文件。我期待停止使用标头/源拆分,因为我发现总是更改在不同文件的 2 个位置重复的函数参数非常烦人。

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


【解决方案1】:

那次谈话的作者后来说重新编译问题是一个实现问题。引用 Boris Kolpackov 的文章Common C++ Modules TS Misconceptions

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

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

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

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

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

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

(作为旁注,模块 TS has now been approved 并发送到 ISO 以供发布。)

【讨论】:

  • 内容感知构建系统(例如,SCons)可以很容易地注意到正在重新生成的相同 BMI 并停止重建的传播。但即使更改 cmets 也可以轻松更改 BMI 中包含的诊断/调试信息(可能缺少一些“原始”选项)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2022-01-05
  • 2016-02-02
  • 1970-01-01
  • 2018-06-22
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多