背景
libcxx で iostream cin(や cout)の初期化どうなっているのかしらん?
cin
はグローバルな変数だけど, main の前に初期化(コンストラクタが走る必要がある)する必要があるけどどうなっているのかしら?
(iostream クラスそのものはコピー, コピーコンストラクタを呼ぶのは不可)
ソースコードを調べる
header では
extern istream cin
と定義していました.
まず, ストレージ(メモリ領域)として char の配列で確保していました.
iostream のヘッダとは型が違うので, コンパイラで厳格なエラーを出すようにしている場合 suppress する必要があります.
その後, placement new で, ストレージ領域を iostream として初期化(コンストラクタ)していました!
あとはこの関数が
_LIBCPP_HIDDEN ios_base::Init __start_std_streams __attribute__((init_priority(101)));
により起動時に呼ばれます.
__attribute__((init_priority(101)))
で初期化の優先度を指定していますね. gcc/clang 拡張かな?