Skip to content

ch11 module

主要讲现代 cpp 引入的模块。对于模块的引入,可以说有以下的优点:

  1. 减少编译时间:在传统的头文件方式中,每次编译都需要重新解析和编译被包含的头文件,即使这些头文件没有发生变化。而模块只需要被编译一次,之后的编译过程中可以直接使用编译好的模块,这大大减少了编译时间。
  2. 避免宏和全局变量的污染:传统的头文件方式依赖预处理器,容易引入宏定义和全局变量,这些都可能导致命名冲突和不可预测的行为。模块提供了更好的封装,可以避免这些问题。
  3. 提高代码的可读性和维护性:模块提供了更清晰的依赖关系和接口定义,有助于提高代码的可读性和维护性。
  4. 改善链接性能:传统的头文件包含方式在多次包含大型头文件时会增加链接的工作量。模块通过控制可见性,可以避免不必要的重复链接,从而改善链接性能。

对于模块会进行提前的预编译,预编译分为以下几个步骤:

  1. 解析模块接口:编译器首先解析模块接口文件(通常以.ixx或.cppm为扩展名),这包括模块声明、导出的声明(例如函数、类、变量等)以及模块内部的实现。
  2. 生成模块接口单元:编译器将解析后的模块接口编译成一个模块接口单元(Module Interface Unit, MIU)。MIU包含了模块的元信息和导出的符号,这些信息用于后续的编译过程和模块的使用。
  3. 生成二进制表示:编译器将MIU转换成一种二进制表示形式(比如对象文件或其他中间表示),这个过程可能涉及到代码优化和其他编译技术。这个二进制表示就是预编译后的模块,它可以被存储起来以供后续的编译过程使用。
  4. 存储和管理:预编译后的模块通常会被存储在文件系统中的某个位置,编译器会维护这些模块的索引和依赖关系,以便在编译其他依赖这些模块的代码时快速加载和使用它们。

在实际的编译过程中,当其他源文件或模块导入一个已经预编译的模块时,编译器可以直接加载预编译的模块,而不需要重新解析和编译模块接口,这大大加快了编译速度。