gpt4 book ai didi

c++ - 为什么 setjmp 不保存堆栈?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:48 26 4
gpt4 key购买 nike

为什么 setjmp 不保存堆栈?
考虑以下代码:

#include <iostream>

jmp_buf Buf;
jmp_buf Buf2;

void MyFunction()
{
for(int i = 0; i < 5; i++)
{
std::cout << i << std::endl;
if(!setjmp(Buf))
longjmp(Buf2, 1);
}
}

int main (int argc, const char * argv[])
{
while(true)
{
if(!setjmp(Buf2))
{
MyFunction();
break;
}
longjmp(Buf, 1);
}
return 0;
}

我除了代码会在 main 函数和函数之间来回跳转,每次都打印递增的数字。
实际发生的是它无限次打印 0 然后 1。就好像当它跳回函数时,堆栈被重置为默认值。为什么要这样做?有什么方法可以让它也保存堆栈吗?
我知道 setjmplongjmp 在编码风格和可读代码方面甚至比 goto 更糟糕,但我现在正在试验,这个代码可能永远看不到可用应用程序的光芒。

最佳答案

因为不幸的是,这不是 setjmp 的工作原理。 setjmp 将当前指令指针和寄存器集复制到跳转缓冲区中,但不复制堆栈(显然是因为堆栈很大)。看起来您想使用某种基于协程的技术。如果您想自己执行此操作,请查看 ucontext 程序 (ucontext.h) http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?ucontext.h+3它们将帮助您分配和管理额外的线程堆栈。

或者您可以使用类似 Russ Cox 的 libtask (http://swtch.com/libtask/) 之类的工具来帮助您完成这项工作。或者,如果您想自己做,您应该查看 libtask 代码(也可通过该链接获得)。它非常容易阅读,因此是一个很好的资源。

关于c++ - 为什么 setjmp 不保存堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7224358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com