VC++の例外処理の仕組みを追う その2

id:rayfillさんに教えてもらった「How a C++ compiler implements exception handling」を途中まで読んだんですが、実装がg++と随分違うことが分かりました。

  • 例外オブジェクトはスタック上に配置され、スタックの巻き戻し中もスタックに残ったままになる
  • スタックの巻き戻し自体は完了するまでESPを変えないので、巻き戻し中の関数呼び出しは例外を投げた関数のフレームの続きからスタックを使う(つまり、巻き戻し中のスタックが残っていても問題ない)
  • 例外ハンドラのリストもスタック上に構築されるので動的メモリが一切必要ない

例外オブジェクトがスタックに配置されるので、他のスレッドに持っていく場合はコピーせざるを得ませんね。
あと、この方法なら動的メモリが必要ないので、OSカーネル内でも例外処理が利用可能なはずです。
(NT3.51時代の)ヘルプを見る限り、カーネルモードでもSEHは使えるみたいですし。