OCaml ランタイムで例外がどのように処理され、非常に軽量になるのか知りたいです。setjmp/longjmp を使用しますか、それとも各関数で特別な値を返し、それを伝播しますか?
longjmp はシステムに少し負担をかけるように思えますが、例外が発生した場合にのみ、各関数の戻り値をチェックしながら、関数を呼び出した後にすべての値をチェックする必要があります。多くのチェックとジャンプがあり、パフォーマンスが最悪のようです。
OCaml が C とどのようにインターフェースするか ( http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142 ) を調べ、callback.h を見ると、例外は次を使用してタグ付けされているようです。オブジェクトのメモリ アラインメント ( #define Is_exception_result(v) (((v) & 3) == 2) )。これは、その実装が longjmp を使用せず、各関数呼び出しの後に各関数の結果をチェックしていることを示しているようです。あれですか?または、C 関数は既に例外をキャッチしようとしていて、それをこの形式に変換しますか?
ありがとうございました!