11.11 ARM C++ での C++ の例外処理

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

Rogue Wave 標準 C++ ライブラリは、C++ 例外が有効になった状態で提供されます。
例外テーブル生成の制御は制限付きで実行できます。

実行時に展開される関数

デフォルトでは、--exceptions を指定してコンパイルした関数は、実行時に展開できます。関数の展開には、C++ の自動変数の破棄やスタックフレームに保持されたレジスタ値の復元を行うことが含まれます。関数の展開は、実行される操作を記述した例外テーブルを生成することによって実装されます。
プラグマ #pragma exceptions_unwind および #pragma no_exceptions_unwind を指定して、特定の関数の展開をイネーブルまたはディセーブルに設定できます。--exceptions_unwind オプションを使用して、このプラグマの初期値を設定します。
関数の展開をディセーブルすると、以下の影響があります。
  • 実行時にその関数から例外をスローできないため、そのスローのスタックの展開が行われません。スローしている言語が C++ の場合、std::terminate が呼び出されます。
  • 関数の記述には、非常にコンパクトな例外テーブル表記を使用できます。これによって、テーブルの最適化を伴うリンカの機能を向上できます。
  • 呼び出す側と呼び出される側が正しく相互作用する必要があるため、関数のインライン展開が制限されます。
したがって、#pragma no_exceptions_unwind を使用すると、ソースに不要なコードを追加せずに、展開を強制的に防ぐことができます。
それに対して、C++ では、保護された関数に限り、空の例外関数指定により展開が許可され、ISO C++ 標準に従って std::unexpected() が呼び出されます。
関連する参考文書
8.75 --exceptions_unwind、--no_exceptions_unwind
8.74 --exceptions、--no_exceptions
10.85 #pragma exceptions_unwind、#pragma no_exceptions_unwind
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.