constant-initialization 第二回戦(多分)

constexpr がコンパイル時定数のためだけにあると思っている人に,それ以外の超重要な用途その1を説明するための下準備.
3
Akira Takahashi @cpp_akira

std::call_once_flagのコンストラクタにconstexprが付いてるのだけど、std::call_once()は非const参照をとるからconstexprにしても仕方ない気がするのだけど、これは何に使うのだろう。

2012-09-10 15:01:16
Akira Takahashi @cpp_akira

初期化の話はわかったけど、どうやって使うのかと。

2012-09-10 15:10:48
Akira Takahashi @cpp_akira

どうやって検証すればええの

2012-09-10 15:15:06
Akira Takahashi @cpp_akira

みんなでURLばっかりリプライしてくる・・・

2012-09-10 15:24:06
Akira Takahashi @cpp_akira

検証する方法が思いつかないけど、まぁいいや・・・。

2012-09-10 15:27:13
Akso de la Malbono @Cryolite

@cpp_akira (1)バイナリを読む (2)DSO内で定義されたグローバル変数の初期化がDSOのロード時まで遅延される環境を用意する

2012-09-10 15:35:40
Akso de la Malbono @Cryolite

@kikairoya 【急募】「バイナリを読む」以外の手段で, C++ の規格の範囲内で constant-initialization とそうでない初期化の違いが検出できる方法.

2012-09-10 15:42:34
若年寄(もう若くない) @kikairoya

@Cryolite GCC/GNU binutils の環境に限れば、static initialization用のguard variableが定義されてるかどうかを見れば判別できる気はするが

2012-09-10 16:03:27
Akso de la Malbono @Cryolite

@kikairoya race が起きていても良いので,とにかく zero-init. 以上 static-init. 未満の状態が「見えたっ!」ってなる標準の範囲内のコードなら何でも良いんだけどにゃー?

2012-09-10 16:12:12
若年寄(もう若くない) @kikairoya

@Cryolite 標準はそれが見えないことを要求しているのでは?

2012-09-10 16:22:48
Akso de la Malbono @Cryolite

@kikairoya static-init. だとill-formed なコードからそれが見える可能性があり,なおかつ constant-init. なら論理的にそれが見えることが(恐らく)無く,したがってこれが constant-init が強力であることの根拠になるので

2012-09-10 16:36:18
Akso de la Malbono @Cryolite

@kikairoya ill-formed なコードで良いので, zero-init 以上 static-init. 未満な瞬間を捕まえられたら良いかな~,と.

2012-09-10 16:37:13
若年寄(もう若くない) @kikairoya

@Cryolite 適当な別スレッドでメモリぺろぺろするくらいしか思い浮かばない

2012-09-10 16:40:03
Akso de la Malbono @Cryolite

@kikairoya あ,ごめんちゃい! 用語間違えた! static-init. って書いてたの, dynamic-init. の間違いだった!

2012-09-10 16:41:12
Akso de la Malbono @Cryolite

@kikairoya で,まー,まさに別スレッドでメモリぺろぺろすることを考えてました. mutex や once_flag のデフォルトコンストラクタに付いている constexpr はまさにその状況で安全に動作させるためのものなので.

2012-09-10 16:42:40
若年寄(もう若くない) @kikairoya

@Cryolite それならグローバルに置いてあるオブジェクトを __attribute__((constructor)) な関数の中でポインタか参照経由で触ればよい

2012-09-10 16:42:46
若年寄(もう若くない) @kikairoya

@Cryolite function-local な static-duration の object だとポインタ捏造して覗くしかないかな

2012-09-10 16:43:52