不应该啊。我跑过测试,一万个协程根本没用掉啥内存。可能是因为我每个协程的调用路径都非常短吧。
c++20 stackless 协程就是把程序拿出来变换,把每个 async 函数变成一个这样的类型:
struct Coroutine@main_cpp#l203 {
int var1;
string var2;
int state = 204; // 行号
int resume();
};
然后把所有本来是访问局部变量的语句都变换到访问这这个结构体。再把整个函数丢到 resume() 里面,并且在每个 co_await() 位置插入 case 语句。具体的原理你查一下戴夫设备。
int Coroutine@main_cpp#l203::resume()
{
switch (state) {
...
state = 215; // 第一个 co_yield() 的实现
return value;
case 215; // 第一个 co_yield() 的行号
....
state = 228;
return value; // 第二个 co_yield() 的实现
case 228; // 第二个 co_yield() 的行号
...
return xxx;
}
}
每次 co_await() 一个协程函数都需要在堆里面 new 这么一个结构体出来,可想而知有多占用内存了。而且生生地把连续的内存变成堆上的一个个块。
【 在 ylh0315 的大作中提到: 】
: 我就是不懂stackless怎么玩栈。
: 我是用stackfull,当然我也没处理1m协程,大概处理过1万多点,内存已经很可观了。
--
修改:hgoldfish FROM 59.60.25.*
FROM 59.60.25.*