c++ - setjmpがスタックを保存しないのはなぜですか?

c++ longjmp setjmp

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を無限に出力することです。関数にジャンプして戻ると、スタックはデフォルトにリセットされたようになります。なぜそれをしているのですか?スタックを保存する方法はありますか?
コーディングスタイルと可読コードに関しては、setjmplongjmpgotoよりもさらに悪いことはわかっていますが、今は実験を行っています。このコードでは、おそらく使用可能なアプリケーションのライトは表示されません。
答え
残念ながら、それは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++ - coutをキャプチャして関数にリダイレクトする

c++ - Eclipseを使用してMySQLをC++に接続しますか?

c++ - C++用のどのXSLTプロセッサーですか?

c++ - オブジェクト指向プログラミング-メンバーとしての変数、またはグローバルとしてのヘッダーのみ?

c++ - TinyXmlパーサーはファイルを正しくロードすることを拒否します

c++ - shared_ptrでラムダをブーストする

c++ - C++ / CLIを使用したネイティブC++テンプレートクラスのラップ

c++ - C++でページのコンテンツを取得する

c++ - アプリケーションにフォーカスがない場合のキープレスの検出

c++ - BOOST ASIO:Windowsで「bind:Address already in use」を取得しないのはなぜですか(ただし、Linuxで取得します)?