Mon*_*nku 29 c++ c++20 c++-modules
我正在阅读论文A Module System for C++ 来理解C++模块,这是C++的一个提议特性.
我无法完全理解此模块架构如何导出模板.
有任何想法吗?
Nir*_*man 28
目前,C++实现实际上只有两个与代码相对应的"东西":我们人类编写和编辑的源代码,以及编译器根据源代码吐出的汇编.
因为C++模板是"具体化的",所以每个模板实例化都会分开单独的程序集.因此,在定义模板的地方不能生成任何组件,只能在它们被使用的地方生成.这就是为什么模板必须在头文件中,所以它们基本上可以复制粘贴到使用点(这就是#include真的).
我们的想法是获得代码的第三种表示.试想一下,在内部编译器具有某种内部表示的后已解析的代码,但之前它开始产生组件.它产生的"东西"最终是抽象语法树(AST)的某种表示.它基本上就是你的程序,从最简单的人类形式映射到最简单的计算机形式.
这大致是模块背后的想法(或者至少是它们的实现).你拿你的代码,并吐出一些代表AST的文件.这个AST是你的程序的完整代表,所以它完全无损.它知道您声明的模板的所有内容,依此类推.加载模块时,它只会加载此文件,编译器可以使用它,就像它具有所有可用源一样.但是,将人类可读源转换为AST的步骤实际上是非常昂贵的一步.从AST开始可以快得多.
如果您只有一个翻译单元,这将会更慢.毕竟,解析 - > codegen仍然比解析更快 - >序列化 - >反序列化 - > codegen.但是说你有10个翻译单元都是#include vector.您将在向量中解析代码10次.此时,序列化/反序列化的额外成本被您只需要解析一次这一事实所抵消(并且反序列化可以比解析快得多;这种数据格式将专门设计用于快速反序列化,而源代码是旨在可读,向后兼容等).
在某种意义上预编译的标题是模块的预览:https://clang.llvm.org/docs/PCHInternals.html
| 归档时间: |
|
| 查看次数: |
4256 次 |
| 最近记录: |