C++ の例外処理

ARM Compilation Tools では、C++ の例外処理が完全にサポートされます。ただし、デフォルトではサポートされません。C++ の例外処理は、--exceptions オプションを指定してイネーブルにする必要があります。詳細については、‑‑exceptions、--no_exceptionsを参照して下さい。

Note

Rogue Wave 標準 C++ ライブラリは、C++ 例外が有効になった状態で提供されます。

例外テーブル生成の制御は制限付きで実行できます。

Show/hide実行時に展開される関数

デフォルトでは、--exceptions を指定してコンパイルした関数は、実行時に展開できます。詳細については、‑‑exceptions、--no_exceptionsを参照して下さい。関数の展開には、C++ の自動変数の破棄やスタックフレームに保持されたレジスタ値の復元を行うことが含まれます。関数の展開は、実行される操作を記述した例外テーブルを生成することによって実装されます。

プラグマ #pragma exceptions_unwind および #pragma no_exceptions_unwind を指定して、特定の関数の展開をイネーブルまたはディセーブルに設定できます。詳細については、プラグマを参照して下さい。--exceptions_unwind オプションを使用して、このプラグマの初期値を設定します。

関数の展開をディセーブルすると、以下の影響があります。

  • 実行時にその関数から例外をスローできないため、そのスローのスタックの展開が行われません。スローしている言語が C++ の場合、std::terminate が呼び出されます。

  • 関数の記述に非常にコンパクトな例外テーブル表記を使用できるため、テーブルの最適化が行われ、リンカの機能を向上できます。

  • 呼び出す側と呼び出される側が正しく相互作用する必要があるため、関数のインライン展開が制限されます。

したがって、#pragma no_exceptions_unwind を使用すると、ソースに不要なコードを追加せずに、展開を強制的に防ぐことができます。

それに対して、C++ では、保護された関数に限り、空の例外関数指定により展開が許可され、ISO C++ 標準に従って std::unexpected() が呼び出されます。

Copyright © 2010 ARM. All rights reserved.ARM DUI 0491BJ
Non-ConfidentialID011811