繁体   English   中英

C++20 模块是如何编译的?

[英]How are C++20 modules compiled?

一些消息来源说编译器解析模块并创建抽象语法树(AST),然后在解析导入模块的所有代码文件时使用它。 与 #include 头文件相比,这将减少编译器必须执行的解析量,但是对于导入模块的每个代码文件,所有内容仍然必须编译一次。

其他消息来源说模块只编译一次。

模块是如何以及何时编译的,这对编译时的内联有何影响?

模块编译的产品是依赖于实现的。 但从广义上讲,它们是编译器需要它们来使模块包含有效的任何东西。 毕竟,这就是模块的全部意义所在。 在构建模块接口时,编译器拥有它需要的 100% 的信息,以使包括该模块接口高效。

模块编译与“内联”只有一个特殊的交互:在 class 定义中定义的 class 的成员函数没有隐式地给出inline声明。 这是模块对“内联”的唯一影响。

当然, inline关键字并不是严格意义上的“内联”。 如果您将事物的定义放在模块的接口文件中,那么导入这些接口的人可以使用这些定义进行内联,无论是否使用了inline关键字(显式或隐式)。 这是真正的前置模块,在模块构建中仍然如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM