[C++]constexpr! constant initialization! @ELF

C++ の constexpr による constant initialization の ELF における実装の話かも!?
11
AoiMoe a.k.aしお兄P @AoiMoe

@kosaki55tea C++11からの新機能という話だと、TLS対応ですかねえ

2012-06-14 20:32:04
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@AoiMoe ああ、そのへん知らないんだよねえ。dlopen()したときは裏でmalloc呼ばれてるから気をつけないと危険があぶないというのは最近 glibc ml で知った

2012-06-14 20:34:33
AoiMoe a.k.aしお兄P @AoiMoe

スレッドが絡まないなら、DSOでも .data が RDWR で mmap されるだけで、あとはせいぜい PIC のオフセットが適当に調整されるってのが普通の実装のような気がする。

2012-06-14 20:39:13
SODA Noriyuki @n_soda

@kosaki55tea @Cryolite @AoiMoe ただ(当然のことながら) dlopen()したDSOのstatic変数の初期化処理は、dlopen()時に動的に走りますよね。それが constexpr とどう関わるのか(あるいは全く関わらないのか)分かってませんが

2012-06-14 20:41:23
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@n_soda @AoiMoe @Cryolite やっぱりC++を全然知らないせで会話についていけてない予感がしますねえ。正直C++はもう心が折れたので頑張れない

2012-06-14 20:43:42
AoiMoe a.k.aしお兄P @AoiMoe

@n_soda @kosaki55tea @Cryolite ああなるほど、constexpr絡みですか。それならば、結果として得られたバイト列が .data なり .tdata に置かれるだけでしょうね。

2012-06-14 20:47:22
AoiMoe a.k.aしお兄P @AoiMoe

いままでは constant initialization にならなかったような「コンストラクタを持つクラスの初期化」や「関数の戻り値による初期化」の一部が constant initialization になる、ということだと思う

2012-06-14 20:49:58
AoiMoe a.k.aしお兄P @AoiMoe

C++03 ではグローバルスコープで struct A { A() : v(1) { } int v; } x; って書くと .ctors から A::A() を呼び出す、って形になるんだが

2012-06-14 20:54:11
AoiMoe a.k.aしお兄P @AoiMoe

C++11 で struct A { constexpr A() : v(1) { } int v; } x; って書くと直接 .data に 1 を置いてくれる、ってな話だと思う

2012-06-14 20:55:25
AoiMoe a.k.aしお兄P @AoiMoe

gcc 4.7.0 では実際にそういう動作になっている

2012-06-14 20:57:15
AoiMoe a.k.aしお兄P @AoiMoe

あらためてすげえ機能だと思う>constexpr にすると .data に計算済みのバイト列を直接置いてくれる

2012-06-14 21:05:10
AoiMoe a.k.aしお兄P @AoiMoe

「副作用がない」とかいくつかの条件満たすと、浮動小数点数だろうがクラスだろうがなんでもコンパイラがあらかじめ計算して .data に展開してくれる

2012-06-14 21:06:57
AoiMoe a.k.aしお兄P @AoiMoe

コンパイラで計算させるとすると、浮動小数点数がかなり鬼門だと思うんだが、まあいまどきは IEEE754 しかないからあんまり問題にならんのかな。そのせいか、最近の gcc は GMP とか MPFR みたいな大げさなライブラリをリンクするけど。

2012-06-14 21:11:52
AoiMoe a.k.aしお兄P @AoiMoe

ld の -l でリンクするときって DSO 側のグローバル変数ってどうやって解決するんだっけか。

2012-06-14 21:16:06
AoiMoe a.k.aしお兄P @AoiMoe

コンパイラはその extern が DSO にあるかどうかなんて認識してないから、全部 ld.so が解決して回るしかないのかもしかして

2012-06-14 21:17:07
AoiMoe a.k.aしお兄P @AoiMoe

ld が勝手にベースポインタ+オフセットに変換する、とかはまあ普通の ld では無理だしなあ

2012-06-14 21:20:48
AoiMoe a.k.aしお兄P @AoiMoe

これもまあ ld.so による解決のレイテンシと実行時パフォーマンスとのトレードオフになるし

2012-06-14 21:22:47
AoiMoe a.k.aしお兄P @AoiMoe

要するに、ライブラリの外からライブラリの中のグローバル変数を参照するとロード時のレイテンシに悪影響がある可能性があるってことで、まあグローバル変数は極力使うなということなんだが、それを言うと _ctype_ とかアレ。

2012-06-14 21:24:48
AoiMoe a.k.aしお兄P @AoiMoe

そして、このレイテンシは変数の数じゃなくて参照されてる場所の数に比例する気がするので以下略

2012-06-14 21:25:38
AoiMoe a.k.aしお兄P @AoiMoe

s/参照されてる/参照してる/

2012-06-14 21:26:28
Akso de la Malbono @Cryolite

なるほど,やはり https://t.co/x6v9D8HX のとおりで, g が DSO 内で constant initialization されているか dynamic initialization されているかが race-freedom に決定的に効いてくる,と.

2012-06-14 21:32:11
Akso de la Malbono @Cryolite

constexpr の型に対する制約も効いてきている.つまり, .data にその型の object representation をそのまま書き込めて,しかも初期値を見せるときに mmap だけで済む,という宣言になっている.

2012-06-14 21:37:21