C++20 四大特性之一:Module 特性详解

本文详细介绍了C++20的重要特性——Module,探讨了C++编译链接模型的历史背景,解释了Module的使用方法,包括最简单的Module实现、接口与实现分离、子模块(Submodule)、Module Partition以及全局模块片段。同时,文章讨论了Module相比于头文件的优势,如提高编译速度、增强隔离性,并提及了Module Map作为与旧代码交互的过渡方案。尽管目前编译器对Module的支持尚不完善,但Module在大型项目中展现的组织灵活性和效率提升潜力使其成为C++开发者值得关注和学习的新特性。
摘要由CSDN通过智能技术生成

C++20 最大的特性是什么?

最大的特性是迄今为止没有哪一款编译器完全实现了所有特性。

文章来源:网易云信

有人认为 C++20 是 C++11 以来最大的一次改动,甚至比 C++11 还要大。本文仅介绍 C++20 四大特性当中的 Module 部分,分为三部分:

探究 C++ 编译链接模型的由来以及利弊

介绍 C++20 Module 机制的使用姿势

总结 Module 背后的机制、利弊、以及各大编译器的支持情况

C++ 是兼容 C 的,不但兼容了 C 的语法,也兼容了 C 的编译链接模型。1973年初,C 语言基本定型:有了预处理、支持结构体;编译模型也基本定型为:预处理、编译、汇编、链接四个步骤并沿用至今;1973年,K&R 二人使用 C 语言重写了 Unix 内核。

为何要有预处理?为何要有头文件?在 C 诞生的年代,用来跑 C 编译器的计算机 PDP-11 的硬件配置是这样的:内存:64 KiB 硬盘:512 KiB。编译器无法把较大的源码文件放入狭小的内存,故当时 C 编译器的设计目标是能够支持模块化编译,即将源码分成多个源码文件、挨个编译,以生成多个目标文件,最后整合(链接)成一个可执行文件。

C 编译器分别编译多个源码文件的过程,实际上是一个 One pass compile 的过程,即:从头到尾扫描一遍源码、边扫描边生成目标文件、过眼即忘(以源码文件为单位)、后面的代码不会影响编译器前面的决策,该特性导致了 C 语言的以下特征:

结构体必须先定义再使用,否则无法知道成员的类型以及偏移,就无法生成目标代码。

局部变量先定义再使用,否则无法知道变量的类型以及在栈中的位置,且为了方便编译器管理栈空间,局部变量必须定义在语句块的开始处。

外部变量只需要知道类型、名字(二者合起来便是声明)即可使用(生成目标代码),外部变量的实际地址由连接器填写。

外部函数只需知道函数名、返回值、参数类型列表(函数声明)即可生成调用函数的目标代码,函数的实际地址由连接器填写。

头文件和预处理恰好满足了上述要求,头文件只需用少量的代码,声明好函数原型、结构体等信息,编译时将头文件展开到实现文件中,编译器即可完美执行 One pass comlile 过程了。

至此,我们看到的都是头文件的必要性和益处,当然,头文件也有很多负面影响:

低效:头文件的本职工作是提供前置声明,而提供前置声明的方式采用了文本拷贝,文本拷贝过程不带有语法分析,会一股脑将需要的、不需要的声明全部拷贝到源文件中。

传递性:最底层的头文件中宏、变量等实体的可见性,可以通过中间头文件“透传”给最上层的头文件,这种透传会带来很多麻烦。

降低编译速度:加入 a.h 被三个模块包含,则 a 会被展开三次、编译三次。

顺序相关:程序的行为受头文件的包含顺影响,也受是否包含某一个头文件影响,在 C++ 中尤为严重(重载)。

不确定性:同一个头文件在不同的源文件中可能表现出不同的行为,导致这些不同的原因,可能源自源文件(比如该源文件包含的其他头文件、该源文件中定义的宏等),也可能源自编译选项。

C++20 中加入了 Module,我们先看 Module 的基本使用姿势,最后再总结 Module 比 头文件的优势。

Module(即模块)避免了传统头文件机制的诸多缺点,一个 Module 是一个独立的翻译单元,包含一个到多个 module interface file(即模块接口文件),包含 0 个到多个 module implementation file(即模块实现文件),使用 Import 关键字即可导入一个模块、使用这个模块暴露的方法。

实现一个最简单的 Module

module_hello.cppm:定义一个完整的hello模块,并导出一个 say_hello_to 方法给外部使用。当前各编译器并未规定模块接口文件的后缀,本文统一使用 ".cppm" 后缀名。".cppm" 文件有一个专用名称"模块接口文件",值得注意的是,该文件不光可以声明实体,也可定义实体。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值