1.45 例外システムの初期化

例外システムは、オンデマンドで(つまり最初の使用時)、または main() を呼び出す前に初期化できます。

オンデマンドによる初期化には、例外システムが使用されない限りヒープメモリが割り当てられないという利点があります。ただし、ヒープが最初の使用時に不足したときに例外(std::bad_allo;c など)をスローできないという欠点もあります。
デフォルト動作は、オンデマンドでの初期化です。main() を呼び出す前に例外システムを初期化するには、以下の関数をリンクに含めます。
extern "C" void __cxa_get_globals(void); extern "C" void __ARM_exceptions_init(void) {     __cxa_get_globals(); }
__cxa_get_globals() の呼び出しはコードに直接配置できますが、この呼び出しを __ARM_exceptions_init() に配置すると、呼び出しが可能な限り早期に実行されるようになります。つまり、グローバル変数が初期化され、main() に入る前に呼び出されます。
__ARM_exceptions_init() はライブラリ初期化メカニズムによって弱く参照されます。また、__rt_lib_init() の一部として存在する場合に呼び出されます。

例外システムは、例えば std::set_terminate() などのさまざまなライブラリ関数の呼び出しによって初期化されます。このため、main() が呼び出される前に必ずしも初期化を行う必要はありません。
関連する概念
1.41 新しい実行環境に合わせた C ライブラリのカスタマイズ
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.