c++20 特性
学习 c++20 首先要有支持相关特性的编译器
msvc2019 如果和工作用的 msvc2015 安装在同一台机器上,在使用 vcpkg 时会产生冲突
clang 在 windows 下的使用并不平滑,如果初衷是 c++20,就不要舍本逐末。在熟悉 c++20 后回头折腾 clang
虚拟机上安装 msvc2019,Hyper-V 是好的选择吗?如果要用 VMware 还是躲开 Hyper-V
安装 msvc2019 对 win10 版本有要求,直接使用两者的在线安装包是省心省力(耐心等下载)的选择。
c++20 的模块 module 如何处理预编译选项的,比如如何处理标准库
Visual Studio 中的模块接口文件需要 ixx 扩展名
编译器在处理头文件和模块的关系时,引入了 global module fragment (全局模块片段)的概念
- 单独使用
module
关键字:用于文件开头,标识内容归属 - 使用
export module
关键字:用于模块接口文件 .ixx - 单独使用
export
关键字:导出什么 import
关键词:先包含头文件,再导入模块
The
import
declaration must appear after themodule
declaration and after any#include
directives, but before any declarations in the file.
模块声明和头文件?
c++20 的三大块:concepts, modules, coroutines
兜兜转转大半年,还是再次碰上协程,啊哈
我接触协程起始于 asio 库,当时不得其法,异步 io 叠加其中的三类协程,弯弯绕绕很混乱。这次单纯地从 c++20 的协程 入手,慢慢理解。以下的“协程”,狭义的特指 C++20 标准引入的无栈协程,而非更宽泛意义上的概念。
概念上,协程就是能够重入的函数。具体实现上,多种多样,复杂程度和理解难度也不一。
Coroutines are stackless: they suspend execution by returning to the caller and the data that is required to resume execution is stored separately from the stack.
协程暂停执行,控制权返回给调用者。为了恢复执行保存的状态和数据,不在栈上。
c++20 中什么样子的函数才是协程呢?
- 函数定义使用了
co_await
co_yield
co_return
- 函数返回值满足以下要求:??????? 定义了某些特定方法的类型。
协程的返回值并不是普通的值而是一个可以和外界(或另外一个协程)相互协作的对象
每个协程关联了 promise object , coroutine handle, coroutine state. 这里的 promise object 和 std::promise
无关
- the promise object, manipulated from inside the coroutine.
- the coroutine handle, manipulated from outside the coroutine.
- the coroutine state, which is an internal, heap-allocated object that contains the promise object, …
The Promise type is determined by the compiler from the return type of the coroutine using
std::coroutine_traits
.
作为一名普通的程序员,我大概率是只是用别人写好的协程库,不会自己写的。
封装异步接口:用户的便利建立在库开发者的辛苦之上