「pimpl」のすゝめ

@SubaruG センセが pimpl についてわかりやすくつぶやいていたのでまとめました。C++ ならでは(?)の解説ですね。
9
普通のC++使い、銀天すばる @SubaruG

ぼくだって必要なときゃ継承による多態と実質的に同じことをやってますが、それを外部に露出させることはしない、ってだけなんですけどね。

2010-08-18 19:46:10
普通のC++使い、銀天すばる @SubaruG

そういう場合に pimpl は便利なのです。

2010-08-18 19:46:22
普通のC++使い、銀天すばる @SubaruG

勿論、外部に露出させないためには、一段皮を増やさなきゃいけない。その分の関数呼び出しコストを嫌うのはC++erなら当たり前です。普通はリンク時に最適化してくれるけど。

2010-08-18 19:46:54
ドクターねるねるねるね @DrNerunerunerun

@SubaruG 私はファクトリですねー・・・ 書いてるコードがほとんどゲーム機ないしそれに順ずる環境のものですし。

2010-08-18 19:48:21
普通のC++使い、銀天すばる @SubaruG

@yreeen 僕はファクトリではなくコンストラクタを使う、ってだけです。

2010-08-18 19:49:17
普通のC++使い、銀天すばる @SubaruG

@yreeen 内部的には継承による多態を使ってるんだけど、特別なファクトリ関数は持ってきたくないので、一段包んだ普通のクラスのコンストラクタとして表現している。好みの問題っちゃ好みの問題なのですが、コンストラクタはC++の意味論に従ってくれるので。

2010-08-18 19:50:40
普通のC++使い、銀天すばる @SubaruG

結局、ファクトリが嫌いなだけだということに気づいた。 うん、嫌い。

2010-08-18 19:52:28
普通のC++使い、銀天すばる @SubaruG

オブジェクトを作るのはコンストラクタの役目なのだ。

2010-08-18 19:52:48
普通のC++使い、銀天すばる @SubaruG

@yreeen 例外を使わない場合でも例外安全の考え方は大事だと思うのです。

2010-08-18 19:54:50
ドクターねるねるねるね @DrNerunerunerun

newで作ってコンストラクタで初期化?newで確保してコンストラクタで作る?どっちでもいいけど

2010-08-18 19:54:51
ドクターねるねるねるね @DrNerunerunerun

newでメモリ確保してコンストラクタで初期化か。

2010-08-18 19:55:20
普通のC++使い、銀天すばる @SubaruG

C++ の new とか virtual はライブラリ実装用の糖衣構文だと考えている僕。

2010-08-18 19:57:52
ドクターねるねるねるね @DrNerunerunerun

@SubaruG ライブラリ組むときと弾幕ゲー作るときくらいですね確かに

2010-08-18 20:00:58
はるえす@イカのフレンズ @Rayerd

どんなの?RT @SubaruG: 内部実装として継承や多態を使うことは、たまにある。けど、それを露出させることはしない。理由は、実装が変わったときにクライアントコードも変えなきゃいけないから。

2010-08-18 20:03:23
普通のC++使い、銀天すばる @SubaruG

ん、今考えると、ちょっと不適切ですね。抽象基底クラスを使った多態でも、別に複数の実装から実行時に多態しなければいけない理由はないですから。 RT @Rayerd: http://twitter.com/Rayerd/status/21481383702

2010-08-18 20:06:38
普通のC++使い、銀天すばる @SubaruG

pimpl と全く同じように使う(ただしポインタ経由)ことも普通にできる。その場合のデメリットはコピー関連だけですね。

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

とりあえず、 pimpl は、メンバとして持たせたポインタを どのように扱ってもいいし、そのことによって外部には(再コンパイルを含め)一切の影響がない。 つまり、最初は継承と多態を使ってたけど、効率的にあんまり相応しくない、ということが判明したら

2010-08-18 20:11:16
普通のC++使い、銀天すばる @SubaruG

外部に一切影響を与えずに、仮想関数を使わない形に書き換えることができる。どころか、実はメンバが整数一つだけだと判明したら、 reinterpret_cast でほげほげできる。

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

もちろん整数じゃなくて他のハンドルでもおっけーですが

2010-08-18 20:12:39
普通のC++使い、銀天すばる @SubaruG

外部に一切影響を与えずに黒魔術を導入できる…このことをメリットと感じるのは少数派だと思いますが、僕にはメリットなのです。

2010-08-18 20:13:30
普通のC++使い、銀天すばる @SubaruG

最初は効率を無視して作り、後からあらゆる手段を使って効率を高める、ということが行いやすい。 そう、 pimpl ならね。

2010-08-18 20:14:11
普通のC++使い、銀天すばる @SubaruG

もっとも pimpl な時点で効率は劣化してしまいますが

2010-08-18 20:14:30