现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
4059 人已学习
课程目录
已完结 36 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (11讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
13 | 编译期能做些什么?一个完整的计算世界
14 | SFINAE:不是错误的替换失败是怎么回事?
15 | constexpr:一个常态的世界
16 | 函数对象和lambda:进入函数式编程
17 | 函数式编程:一种越来越流行的编程范式
18 | 应用可变模板和tuple的编译期技巧
19 | thread和future:领略异步中的未来
20 | 内存模型和atomic:理解并发的复杂性
实战篇 (7讲)
21 | 工具漫谈:编译、格式化、代码检查、排错各显身手
22 | 处理数据类型变化和错误:optional、variant、expected和Herbception
23 | 数字计算:介绍线性代数和数值计算库
24 | Boost:你需要的“瑞士军刀”
25 | 两个单元测试库:C++里如何进行单元测试?
26 | Easylogging++和spdlog:两个好用的日志库
27 | C++ REST SDK:使用现代C++开发网络应用
新年特别策划 (2讲)
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
新春福利 | C++好书荐读
未来篇 (3讲)
28 | Concepts:如何对模板进行约束?
29 | Ranges:无迭代器的迭代和更方便的组合
30 | Coroutines:协作式的交叉调度执行
加餐 (1讲)
加餐 | 部分课后思考题答案合集
结束语 (1讲)
结束语 | 终点已达,行程还要继续
现代C++实战30讲
登录|注册

30 | Coroutines:协作式的交叉调度执行

吴咏炜 2020-02-10
你好,我是吴咏炜。
今天是我们未来篇的最后一讲,也是这个专栏正文内容的最后一篇了。我们讨论 C++20 里的又一个非常重要的新功能——协程 Coroutines。

什么是协程?

协程是一个很早就被提出的编程概念。根据高德纳的描述,协程的概念在 1958 年就被提出了。不过,它在主流编程语言中得到的支持不那么好,因而你很可能对它并不熟悉吧。
如果查阅维基百科,你可以看到下面这样的定义 [1]
协程是计算机程序的⼀类组件,推⼴了协作式多任务的⼦程序,允许执⾏被挂起与被恢复。相对⼦例程⽽⾔,协程更为⼀般和灵活……
等学完了这一讲,也许你可以明白这段话的意思。但对不了解协程的人来说,估计只能吐槽一句了,这是什么鬼?
图片源自网络
很遗憾,在 C++ 里的标准协程有点小复杂。我们还是从……Python 开始。
def fibonacci():
a = 0
b = 1
while True:
yield b
a, b = b, a + b
即使你没学过 Python,上面这个生成斐波那契数列的代码应该也不难理解。唯一看起来让人会觉得有点奇怪的应该就是那个 yield 了。这种写法在 Python 里叫做“生成器”(generator),返回的是一个可迭代的对象,每次迭代就能得到一个 yield 出来的结果。这就是一种很常见的协程形式了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(3)

  • 谦谦君子
    老师, 图左边“调用X的参数”在“返回Y的地址”下面, 而右边“调用X的参数”在“返回Y的地址”上面, 是画错了么, 还是协成里面就是跟栈上函数调用是反的呢?

    作者回复: 在栈里是一个明确的压栈顺序的(x86或类似平台上不管什么编译器实现都差不多)。而协程的数据放在堆里,并没有类似的顺序惯例,实际实现的顺序可能完全不一样。

    2020-02-12
    1
  • 晚风·和煦
    老师,map<int, int>().swap(map1);
    这个语句为什么不能达到真正释放map1内存的效果呢?必须得用malloc_trim

    作者回复: 先说是不是,然后才谈得上为什么。

    在大部分情况下都没有必要那么做。我从来没在代码里写过 malloc_trim。

    在有虚拟内存的世界里,我看不出调用 malloc_trim 的必要性。操作系统自己能管好。

    如果嵌入式开发,没有虚拟内存,你用 malloc_trim 也不见得有用。因为一旦堆的尾部有分配,你并不能释放内存回操作系统。

    而且,你为什么要还内存给操作系统?以后你不用了吗?是程序要退出了吗?如果程序要退出,本来占用的资源就会被释放掉。如果程序不退出,进程管好自己的事,下次分配能不麻烦操作系统就不麻烦操作系统,应该反而更好。

    我的个人见解,谁告诉你这句话的,基本上并不真懂应用开发,只是学了点 Linux 的知识,在瞎卖弄而已。

    2020-02-11
    1
  • Vackine
    感觉跟python里面的async的新的标准库好像,是真的有性能上的提升么,还是只是编程魔法?

    作者回复: 编程魔法和性能提升有矛盾么?🤪

    严肃点,协程不是为了提高代码性能,而是为了提高程序员的生产率。从这点上来说,协程仍然是一种编译器的黑魔法。

    跟手写比起来,没有性能的提升。就如同除了极少数的情况(比如泛型允许内联导致C++的排序比C的qsort快),C++代码不会比C代码性能更高。

    2020-02-10
收起评论
3
返回
顶部