1.8.2 C++ の初期化、構築、および破棄

C++ 標準では、スタティックな保存期間を持つオブジェクトに対する構築と破棄に関してある程度の要件が設けられています。静的コンストラクタは main() の前に実行され、プログラム終了後にデスタラクタが呼び出されます。

ライブラリでは、変換単位内のすべての静的コンストラクタが宣言の順序で呼び出され、静的デストラクタが宣言の逆の順序で呼び出されるようにする必要があります。変換単位間の初期化順を決定する方法はありません。
静的コンストラクタが含まれる各変換単位には、初期化関数が存在します。この関数は、変換単位の静的コンストラクタを呼び出し、__aeabi_atexit() への呼び出しにより静的デストラクタを登録します。デストラクタを含む、関数のローカルなスタティックオブジェクトも、__aeabi_atexit() を使用してデストラクタを登録します。
変換単位ごとの初期化関数の場所は、.init_array セクションに保存されます。リンク時、.init_array セクションは、1 つの連続的な .init_array セクションにまとめて照合される必要があります。これが不可能な場合は、リンカによりエラーが生成されます。
ライブラリルーチン __cpp_initialize_aeabi_ は、main() が呼び出される前に、C ライブラリスタートアップコード __rt_lib_init() から呼び出されます。__cpp_initialize_aeabi_ は、該当する関数を呼び出しながら .init_array を順番に実行します。
終了時、__rt_lib_shutdown() は、__aeabi_atexit() により登録された静的デストラクタを呼び出す cxa_finalize() を呼び出します。

  • __aeabi_atexit() 関数は malloc() を呼び出します。
  • libc++ を使用する場合、静的コンストラクタの std::coutstd::cerr、および std::clog の各ストリームは使用しないで下さい。これらのオブジェクトには、実行されたことが保証されていない静的コンストラクタが含まれているためです。
関連する概念
1.8 新しい実行環境に合わせた C ライブラリのカスタマイズ
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.