LoginSignup
0
0

More than 3 years have passed since last update.

libcxx iostream cin 初期化メモ

Last updated at Posted at 2020-11-17

背景

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 拡張かな?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0