[C++]constexpr! constant initialization! @ELF
@AoiMoe ああ、そのへん知らないんだよねえ。dlopen()したときは裏でmalloc呼ばれてるから気をつけないと危険があぶないというのは最近 glibc ml で知った
2012-06-14 20:34:33スレッドが絡まないなら、DSOでも .data が RDWR で mmap されるだけで、あとはせいぜい PIC のオフセットが適当に調整されるってのが普通の実装のような気がする。
2012-06-14 20:39:13@kosaki55tea @Cryolite @AoiMoe ただ(当然のことながら) dlopen()したDSOのstatic変数の初期化処理は、dlopen()時に動的に走りますよね。それが constexpr とどう関わるのか(あるいは全く関わらないのか)分かってませんが
2012-06-14 20:41:23@n_soda @AoiMoe @Cryolite やっぱりC++を全然知らないせで会話についていけてない予感がしますねえ。正直C++はもう心が折れたので頑張れない
2012-06-14 20:43:42@n_soda @kosaki55tea @Cryolite ああなるほど、constexpr絡みですか。それならば、結果として得られたバイト列が .data なり .tdata に置かれるだけでしょうね。
2012-06-14 20:47:22いままでは constant initialization にならなかったような「コンストラクタを持つクラスの初期化」や「関数の戻り値による初期化」の一部が constant initialization になる、ということだと思う
2012-06-14 20:49:58C++03 ではグローバルスコープで struct A { A() : v(1) { } int v; } x; って書くと .ctors から A::A() を呼び出す、って形になるんだが
2012-06-14 20:54:11C++11 で struct A { constexpr A() : v(1) { } int v; } x; って書くと直接 .data に 1 を置いてくれる、ってな話だと思う
2012-06-14 20:55:25あらためてすげえ機能だと思う>constexpr にすると .data に計算済みのバイト列を直接置いてくれる
2012-06-14 21:05:10「副作用がない」とかいくつかの条件満たすと、浮動小数点数だろうがクラスだろうがなんでもコンパイラがあらかじめ計算して .data に展開してくれる
2012-06-14 21:06:57コンパイラで計算させるとすると、浮動小数点数がかなり鬼門だと思うんだが、まあいまどきは IEEE754 しかないからあんまり問題にならんのかな。そのせいか、最近の gcc は GMP とか MPFR みたいな大げさなライブラリをリンクするけど。
2012-06-14 21:11:52コンパイラはその extern が DSO にあるかどうかなんて認識してないから、全部 ld.so が解決して回るしかないのかもしかして
2012-06-14 21:17:07要するに、ライブラリの外からライブラリの中のグローバル変数を参照するとロード時のレイテンシに悪影響がある可能性があるってことで、まあグローバル変数は極力使うなということなんだが、それを言うと _ctype_ とかアレ。
2012-06-14 21:24:48なるほど,やはり https://t.co/x6v9D8HX のとおりで, g が DSO 内で constant initialization されているか dynamic initialization されているかが race-freedom に決定的に効いてくる,と.
2012-06-14 21:32:11constexpr の型に対する制約も効いてきている.つまり, .data にその型の object representation をそのまま書き込めて,しかも初期値を見せるときに mmap だけで済む,という宣言になっている.
2012-06-14 21:37:21