2010年4月13日

真夜中のconst 性とマルチスレッド

3
普通のC++使い、銀天すばる @SubaruG

コンストラクタが実行された時点で、全ての処理は完了している。これが理想の世界。うむ。

2010-04-12 23:06:59
普通のC++使い、銀天すばる @SubaruG

operator=とswapとresetを除く 全てのメソッドには const を付けるべきですよね。

2010-04-12 23:09:10
対鉱物用武装 @kikairoya

@SubaruG assignはoperator =に含まれますか

2010-04-12 23:10:08
普通のC++使い、銀天すばる @SubaruG

const はクラスの設計にダイレクトに関わってくる。一般的に、非 const 参照以外の値を返すメソッドは、全て const であることが望ましい。それ以外は全て void で統一する。

2010-04-12 23:17:06
普通のC++使い、銀天すばる @SubaruG

ただし、世の中には const な void メソッドも存在するので、そういう場合もあるということは認識しておく必要がある。詳しくは Exceptional C++

2010-04-12 23:18:50
普通のC++使い、銀天すばる @SubaruG

簡単に言えば、キャッシュを予め計算しておくようなメソッドは、 void を返す const メソッドにするのが自然。

2010-04-12 23:19:43
普通のC++使い、銀天すばる @SubaruG

キャッシュと言うのは処理の詳細であって、インターフェイスには現れない部分。そういうところは抽象化で真っ先に消されるよね。

2010-04-12 23:24:48
普通のC++使い、銀天すばる @SubaruG

どのように処理をしているかには興味がなくて、何を処理してるか、というのだけわかればいい。「何」の部分で不変であるなら、具体的な処理によらず、それは const にするべき

2010-04-12 23:26:09
普通のC++使い、銀天すばる @SubaruG

ただ、マルチスレッドだと、この考えってのは甘いんだよなぁ。

2010-04-12 23:27:27
普通のC++使い、銀天すばる @SubaruG

物理的に不変であるか否か、という新しいレイヤーでの const 性も欲しい。

2010-04-12 23:28:26
普通のC++使い、銀天すばる @SubaruG

mutable とか const_cast とか一切認めず、完全に不変。

2010-04-12 23:28:47
普通のC++使い、銀天すばる @SubaruG

ビット列的に、深いレベルも含めて、不変。という表明。

2010-04-12 23:30:11
普通のC++使い、銀天すばる @SubaruG

不変なものは共有出来る。C++にはGCがないから不完全だけど。

2010-04-12 23:31:48
普通のC++使い、銀天すばる @SubaruG

無論、今までの const であっても、論理的には共有出来る。

2010-04-12 23:32:54
普通のC++使い、銀天すばる @SubaruG

というより、共有しても構わないか、ってのが論理的な const 性と多分一致する。

2010-04-12 23:33:20
普通のC++使い、銀天すばる @SubaruG

ただ、マルチスレッドを考えると、それだけじゃ足りない。意味的に const であっても、処理中にdirtyな状態が有るなら、それはマルチスレッド的な意味で const じゃない。

2010-04-12 23:35:00
普通のC++使い、銀天すばる @SubaruG

マルチスレッド的な意味で const か否がが分かれば、ロック関連でスムーズに処理出来る。 まぁ、その辺はユーザが手で対処してやればいいんですが。スレッドに関するポリシー持たせて。でも、出来ればコンパイラによろしくやって欲しいなぁ、と。

2010-04-12 23:38:59
やまさ @yamasa

@SubaruG Javaは、マルチスレッドでも安全な不変性を保証することができます。final修飾されたフィールドの値は、コンストラクタ終了後は他スレッドから見た場合でも必ず不変です。

2010-04-13 01:08:33
やまさ @yamasa

@SubaruG しかし、C++0xではJavaのような方針を採りませんでした。Javaの方法では暗黙的なメモリバリアをあちこちに埋め込む必要があるので、ゼロオーバーヘッド原則に反するからでしょう。

2010-04-13 01:09:22
普通のC++使い、銀天すばる @SubaruG

@yamasa んーと、まず論理的なconst性が欲しいですね、僕としては。マルチスレッドは二の次です。

2010-04-13 01:10:12
やまさ @yamasa

@SubaruG シングルスレッドであれば、今までのconstでも十分ではないですか?

2010-04-13 01:13:05
普通のC++使い、銀天すばる @SubaruG

@yamasa 今までの const とは別に、欲しいと言うことですね。

2010-04-13 01:13:52
普通のC++使い、銀天すばる @SubaruG

@yamasa 論理的な const 性と、物理的な const 性はぜんぜん違うものですから( what と how の違いですね)、今の論理的な const はそのままで、実装補助として新しい物理的な概念が有るといいな、って話ですー。

2010-04-13 01:15:37
残りを読む(79)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?