讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ 协程的上下文切换 c++协程挂起时保存了哪些信息

阿枫大大_2850

阿枫大大_2850

发布时间:2026-04-01 20:16:51

|

877人浏览过

|

来源于php中文网

原创

协程挂起时只保存最小必要状态:await_suspend返回的handle、跨挂起点的局部变量(含引用和lambda捕获)、挂起点前的栈上临时对象;不保存TLS、全局变量、寄存器及上层函数局部变量。

c++ 协程的上下文切换 c++协程挂起时保存了哪些信息

协程挂起时到底保存了什么

协程挂起不是“暂停整个线程”,而是把当前函数执行现场的**最小必要状态**快照存起来,等恢复时能接着往下跑。C++20 协程标准不规定具体保存哪些寄存器或栈帧,但所有编译器(MSVC / Clang / GCC)都必须保存以下三类信息:

  • await_suspend 返回的 handle:这是恢复协程的唯一入口,必须保存
  • 局部变量(含引用、const 修饰符、lambda 捕获):只要生命周期跨挂起点,就进协程帧(coroutine frame)
  • 挂起点前的栈上临时对象:比如 std::string s = "hello" 在 co_await 前构造,它必须活到恢复后——所以会被移到协程帧里

不会保存的东西:线程局部存储(TLS)、全局变量、寄存器(如 rax)、调用栈中更上层函数的局部变量(除非它们被当前协程闭包捕获)。

为什么有些变量没进协程帧却还能用

常见错觉:“我啥都没动,变量还在那儿”。其实是编译器做了优化:

  • 纯右值临时量(如 co_await std::make_ready_future(42) 中的 42)可能被直接常量折叠,不占空间
  • 未跨挂起点的局部变量(比如定义在 co_await 后面的 int x = 1;)根本不会被保存——恢复后重新执行初始化语句
  • 引用类型若绑定到静态/全局对象(如 int& r = global_i;),只存地址,不复制值

真正危险的是绑定到栈变量的引用:int local = 1; int& r = local; —— 若 local 所在栈帧已退出(比如挂起发生在函数返回前),恢复后 r 就是悬垂引用。

立即学习“C++免费学习笔记(深入)”;

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

怎么查自己协程帧里实际存了啥

别猜,直接看编译器生成的帧结构。Clang 和 GCC 支持 -fsanitize=undefined + -g,配合 gdb 查看协程帧地址;更直接的是用编译器内置宏和调试信息:

  • 加 -fcoroutines -g 编译,用 objdump -t 或 readelf -s 查找以 __coro 开头的符号,对应帧布局
  • 在 promise_type::get_return_object 里打印 sizeof(*this)(注意:这是 promise 对象大小,不是整个帧)
  • 用 clang++ -Xclang -emit-coroutine-expansions 可看到协程被重写成状态机后的代码,里面 struct 成员就是实际保存的字段

MSVC 下可用 /d1reportAllClassLayout 输出类布局,找到你的 promise_type 和编译器合成的帧 struct。

挂起后栈指针和寄存器谁负责恢复

协程切换不涉及传统上下文切换(比如 setjmp/longjmp 或系统级 swapcontext)。C++ 协程的“恢复”本质是:调用之前保存的 coroutine_handle<> 的 resume(),它会跳转回协程函数内某处(通常是挂起点之后的恢复点),并从协程帧里重新加载局部变量值。

  • 栈指针(rsp / sp)由编译器生成的恢复代码重置——它把协程帧里的变量“放回”当前栈帧(或直接在帧内访问,取决于优化)
  • 通用寄存器(rax, rbx 等)不保存也不恢复:它们属于调用者上下文,协程恢复后继续使用当前线程的寄存器状态
  • 唯一需要人工干预的是 FPU/SIMD 寄存器:如果协程挂起前用了 __m256 计算且未对齐保存,恢复后可能出错——但这种情况极少见,现代编译器通常自动处理

真正容易被忽略的是:协程帧本身分配在堆上(默认),而帧里的对象构造/析构顺序依赖于挂起/恢复路径——一旦在 await_suspend 里抛异常,帧可能部分构造,析构逻辑就变得非常脆弱。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1938

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3725

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1530

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2665

2024.08.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn