2

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;
}

私が例外としているのは、コードがメインから関数に前後にジャンプし、毎回増加する数を逆に表示することです。
実際に起こることは、それが印刷0され、その後1無限に繰り返されることです。関数にジャンプして戻ると、スタックがデフォルトにリセットされるかのようです。なぜそれをしているのですか?スタックも保存する方法はありますか?コーディング スタイルや読み取り可能なコードに関しては、さらに悪いことは
わかっsetjmpていますが、現在実験中であり、このコードが使用可能なアプリケーションの光を見ることはおそらくないでしょう。longjmpgoto

4

1 に答える 1

2

残念ながら、それは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 コードを確認する必要があります (リンクからも入手できます)。とても読みやすいので参考になります。

于 2011-08-28T22:31:28.810 に答える