は、このコードがあります:例外ハンドラ
09 03 00 00 7a 69 6d 00
:
- 09 03 00私がスタックに見れば
char text[] = "zim"; int x = 777;
xとテキストがそこに出力され配置される場所00 = 0x309 = 777 < - int x = 777
- 7a 69 6d 00 = char text [] = "zim"(ASCIIコード)
char text[] = "zim"; try{ int x = 777; } catch(int){ }
スタック:新しい4バイトの値を置かれ
09 03 00 00 **97 85 04 08** 7a 69 6d 00
今テキスト間とX
は今のtry..catchとコードがあります。別のキャッチを追加すると、次のようなものが表示されます:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
などとなります。私はこれが例外処理と結びついたいくつかの値だと思っており、tryブロックに例外がスローされたときに適切なcatchを見つけるためにスタックの巻き戻し中に使われます。しかし、質問は、ちょうど正確にこの4バイトの値は(おそらくいくつかのアドレスを例外ハンドラの構造やいくつかのID)ですか?
32ビットLinuxマシンでg ++ 4.6を使用しています。
http:// wwwを指す[C++ try/throw/catch =>マシンコード](http://stackoverflow.com/questions/1331220/c-try-throw-catch-machine-code)を参照してください。 .codeproject.com/Articles/2126/How-aC-compiler-implements-exception-handling –
なぜあなたは知りたいのですか?私たちがあなたに答えを出しても、それはコンパイラとその特定のバージョンのコンパイラに固有のものです。技術的にはC++の質問ではありません。これはg ++についての質問であり、どのように動作するのですか?あなたが本当にg ++の拡張機能を書いているのでなければ、まったく役に立たない知識です。 –
@ LokiAstari:* nix用のg ++や他のC++コンパイラは、ほとんどのプラットフォームで[Itanium ABI](http://sourcery.mentor.com/public/cxx-abi/abi-eh.html)を使用していますプラットフォーム)、それは*プラットフォーム*コンパイラ固有のものではありません。それでも、例外処理機構をどのように実装できるかを知ることは面白いことです。 –