前言

C++20最大的特性是什么?
——最大的特性是迄今为止没有哪一款编译器完全实现了所有特性。

C++20标准早已封版,各大编译器也都已支持了C++20中的多数特性,但迄今为止(2021.7),尚未有哪一款编译器完整支持C++20中的所有特性。有人认为C++20是C++11以来最大的一次改动,甚至比C++11还要大。
本文仅介绍C++20四大特性当中的module部分。全文分为三章:第一章探究C++编译连接模型的由来以及利弊、第二章介绍C++20 module机制的使用姿势、第三章总结module背后的机制、利弊、以及各大编译器的支持情况。
1,C++是兼容C的:不但兼容了C的语法,也兼容了C的编译链接模型
2,1973年初,C语言基本定型:有了预处理、支持结构体;编译模型也基本定型为:预处理、编译、汇编、链接四个步骤并沿用至今;1973年,K&R二人使用C语言重写了Unix内核。
3,为何要有预处理?为何要有头文件?
4,在C的诞生的年代,用来跑C编译器的计算机PDP-11的硬件配置如下:
内存:64 KiB
硬盘:512 KiB
编译器无法把较大的源码文件放入狭小的内存,故当时的C编译器设计目标是能够支持模块化编译(将源码分成多个源码文件,挨个编译)、生成多个目标文件,最后整合(链接)成一个可执行文件。
C编译器分别编译多个源码文件的过程,实际上是一个One pass compile,即:从头到尾扫描一遍源码、边扫描边生成目标文件、过眼即忘(以源码文件为单位)、后面的代码不会影响编译器前面的决策,该特性导致了C语言的以下特征:
A: 结构体必须先定义再使用:否则无法知道成员的类型以及偏移,无法生成目标代码
B: 局部变量先定义再使用,否则无法知道变量的类型以及在栈中的位置。且为了方便编译器管理栈空间,局部变量必须定义在语句块的开始处。
C: 外部变量,只需要知道类型、名字(二者合起来便是声明)即可使用(生成目标代码),外部变量的实际地址由连接器填写
D: 外部函数,只需知道函数名、返回值、参数类型列表(函数声明)即可生成调用函数的目标代码,函数的实际地址由连接器填写。
5 头文件和预处理恰好满足了上述要求:头文件只需用少量的代码,声明好函数原型、结构体等信息,编译时将头文件展开到实现文件中,编译器即可完美执行One pass comlile过程了。
至此,我们看到的都是头文件的必要性、益处,头文件也有很多负面影响:
1  低效。头文件的本职工作是提供前置声明,而提供前置声明的方式采用了文本拷贝,文本拷贝过程不带有语法分析,会一股脑将需要的、不需要的声明全部拷贝到源文件中。
2 传递性。最底层的头文件中宏、变量等实体的可见性,可以通过中间头文件“透传”给最上层的头文件,这种透传会带来很多麻烦。
3 降低编译速度。加入a.h被三个模块包含,则a会被展开3次、编译三次。
4 顺序相关。程序的行为受头文件的包含顺影响,也受是否包含某一个头文件影响,在C++中尤为严重(重载)
5 不确定性。同一个头文件在不同的源文件中可能表现出不同的行为。导致这些这些不同的原因,可能源自源文件(比如该源文件包含的其他头文件、该源文件中定义的宏等),也可能源自编译选项。
5 头文件天然的迫使程序员将声明与实现放在不同的文件,有利于践行“接口与实现分离”,但同时容易引发接口与实现不一致的情况。
C++20中,加入了module。我们先看module 的基本使用姿势,最后再总结module比header的优势。

(二)module的使用

填充内容
2.1 实现一个最简单的module
module_hello.cppm:定义一个完整的hello模块,并导出一个say_hello_to方法给外部使用。当前各编译器并未规定模块文件的后缀,本文统一使用".cppm"后缀名。".cppm"文件有一个专用名称"模块接口文件",值得注意的是,该文件不光可以声明实体,也可定义实体。
//module_hello.cppm
export module hello;
import <iostream>;
import <string_view>;
void internal_helper(){//do something;
}
export void say_hello_to(const std::string_view& something){internal_helper();std::cout<<"Hello "<<something<<" !"<<std::endl;return;
}
main函数中可以直接使用hello模块:
//main.cpp
import hello;
import <string_view>;int main(){say_hello_to(std::string_view{"Netease"});internal_helper();//errorreturn 0;
}

link

C++20四大之一:module特性详解相关推荐

  1. 技术干货 | C++20 四大特性之一:Module 特性详解

    导读:C++20 标准早已封版,各大编译器也都已支持了 C++20 中的多数特性,但迄今为止(2021.7),尚未有哪一款编译器完整支持 C++20 中的所有特性.本文仅介绍 C++20 四大特性当中 ...

  2. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  3. Java9 新特性 详解

    目录 Java9 新特性 详解 1.Java9新特性之---目录结构 2.Java9新特性之---JShell工具 3.Java9新特性之---模块化 4.Java9新特性之---多版本兼容Jar包 ...

  4. oracle dataguard详解,Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向

    Oracle 19c 新特性详解:DataGuard 中ADG的自动DML重定向 在前面的文章<Oracle 19c 十大新特性一览>中,我们曾经提到 Oracle 19c的一个重要增强, ...

  5. java8-stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  6. CSS3新特性详解(三):CSS3 2D转换和3D转换 transform 变形使用详解

      关于CSS3新特性,在上篇博文中"CSS3新特性详解(二):CSS3 字体@font-face详解.如何创建和修改woff字体文件及text-shadow等文本效果",讨论了C ...

  7. JVM底层原理+四大垃圾回收算法详解-周阳老师

    转载自,感谢原作者:https://www.jianshu.com/p/9e6841a895b4 注意:垃圾回收算法周阳老师讲的有错误,具体在p19,四大垃圾回收算法为复制算法.标记-整理算法.标记- ...

  8. 还在用JDK6的同学,来看看JDK13新特性详解吧

    点击上方"搜云库技术团队"关注,选择"设为星标" 回复"面试题"或"1024"获取 4T 学习资料 在 JDK 版本的世 ...

  9. 【ES6】Module模块详解

    [ES6]Module模块详解 一.Module的由来 二.严格模式 三.export命令 四.import命令 查看更多ES6教学文章: 参考文献 引言:由于两个JS文件之间相互使用必须通过一个ht ...

最新文章

  1. springMVC参数绑定与数据回显
  2. 3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. android4.0 开机启动activity 4.0,如何正确理解和使用Activity的4种启动模式
  4. 西京学院计算机科学与技术专业怎么样,西京学院有哪些专业及什么专业好
  5. linux ansible_17本技术书籍,4个出色的Firefox扩展,Linux技巧,Buildah,Ansible和其他热门阅读
  6. 存定期还能加钱进去吗_购买支付宝的定期理财产品,会亏钱吗?
  7. ben we_惊!WE辅助选手Ben离开WE,大舅子还能再有这么默契的辅助吗?
  8. Macos 12 打不开微信解决方案
  9. Oracle JET Model 数据获取与使用
  10. XShell6免费版获取(个人版)
  11. 功能测试报告模板_接口测试用例和报告模板
  12. 银行不良贷款很大一部分是诈骗的结果:CAG
  13. html制作菱锥旋转,怎样用几何画板实现三棱锥的旋转
  14. 黑马程序员_Java基础_前期准备02-1
  15. Xshell配色美化
  16. poi如何去写入excel文件
  17. 21个经典数据科学面试题及答案(上)
  18. android studio ionic,Android studio 运行打包 Ionic 项目
  19. 亚马逊上卖毛绒玩具CPC认证注意事项
  20. 包头学计算机编程,包头小孩编程学校-课程安排

热门文章

  1. 【364天】跃迁之路——程序员高效学习方法论探索系列(实验阶段122-2018.02.04)...
  2. 在公司的局域网内,组长让你在自己的虚拟机部署项目,大家等着访问测试,该怎么办???...
  3. directive多指令之间的异步调用
  4. Java_JDBC_MySql
  5. LeetCode - Valid Number
  6. oracle sys sysman system 介绍
  7. 如何快速打造企业ISO体系文件管理
  8. 对于WIFI版ipad(无GPS芯片)定位功能的释疑
  9. [置顶]       Mybatis技术(二) MyBatis-Spring
  10. CTime COleDateTime的常用操作和比较