我决定看看第 20 个标准中引入了哪些更改,而第一个更改让我感到困惑:模块。很长一段时间以来,我都试图理解为什么要引入它们以及它们应该如何工作(我不是在谈论语法和用法示例)。
据我了解,模块可以作为将代码拆分为头文件和源文件的替代方法!这种分裂不仅发生了。Created 被迫这样做是为了使编译器单程通过。编译器在预处理文件时,用这些包含的内容替换所有包含指令,这是一个简单的操作,只需要您指定在哪里查找这些包含(如果它们不在标准位置之一中)。但是编译器如何处理模块呢?在这里它符合模块导入指令——它的动作?这不是文件名,如果尚未遇到带有此模块的文件,它不知道在哪里寻找它。它是否应该通过资源来寻找该模块的导出位置?搁置当前文件并开始处理其他文件,直到遇到所需的模块?模块如何影响编译器性能?
在文章https://quuxplusone.github.io/blog/2019/11/07/modular-hello-world/中,仅给出了此类问题的答案。底线是您首先需要“预编译”模块,编译器将生成特殊文件。然后以通常的方式完成经典编译。
在给定的路径中找到模块文件的名称(是的,现在,除了包含之外,还会有一个路径)
这只是文件的名称(至少在 clang 的情况下),您必须自己指定在哪里查找它。即使它位于同一个目录中(哦哦)。
为此,程序员必须首先以生成专门设计的模块文件的模式启动编译器。
不,只是经典地说“我不知道它是什么,我不会编译它”
应该有积极的影响。毕竟,现在您不需要解析数百万行的标头代码。
这是码头http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1441r1.pdf - 您可以在其中看到他们在某处为减少编译时间几次所做的工作
以及有关此主题的更多信息https://cor3ntin.github.io/posts/compiletime/