为什么 setjmp 不保存堆栈?
Why isn't setjmp saving the stack?
为什么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
无数次。这就好像当它跳转回函数时,堆栈被重置为默认值。它为什么要这样做?有没有办法让它也保存堆栈?
我知道setjmp
和longjmp
在编码风格和可读代码方面甚至比goto
更差,但我现在正在试验,这段代码可能永远不会看到可用应用程序的光芒。
因为不幸的是setjmp不是这样工作的。Setjmp将当前指令指针和寄存器集复制到跳转缓冲区中,但它不复制堆栈(显然这是因为堆栈很大)。看起来您想使用某种基于协程的技术。如果你想自己做这件事,请检查uncontext过程(uncontext .h) http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?ucontext.h+3,它们将帮助你分配和管理额外的线程堆栈。
或者您可以使用Russ Cox的libtask (http://swtch.com/libtask/)之类的东西,它将帮助您完成此操作。或者,如果您想自己动手,您应该查看libtask代码(也可以通过该链接获得)。它很容易阅读,所以它是一个很好的资源
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在C++中将类(带有Vector成员)保存为二进制文件
- 算法问题:查找从堆栈中弹出的所有序列
- C++.我想将更改后的特定字符行保存在字符串中
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 哈希文件递归并保存到矢量Cryptopp中
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 如何将linux demon/服务的堆栈跟踪保存到外部文件中
- 在函数中创建的对象,它是保存在堆栈上还是堆上
- 为什么 setjmp 不保存堆栈?
- 堆栈对象上的保存指针