「pimpl」のすゝめ
ぼくだって必要なときゃ継承による多態と実質的に同じことをやってますが、それを外部に露出させることはしない、ってだけなんですけどね。
2010-08-18 19:46:10勿論、外部に露出させないためには、一段皮を増やさなきゃいけない。その分の関数呼び出しコストを嫌うのはC++erなら当たり前です。普通はリンク時に最適化してくれるけど。
2010-08-18 19:46:54@SubaruG 私はファクトリですねー・・・ 書いてるコードがほとんどゲーム機ないしそれに順ずる環境のものですし。
2010-08-18 19:48:21@yreeen 内部的には継承による多態を使ってるんだけど、特別なファクトリ関数は持ってきたくないので、一段包んだ普通のクラスのコンストラクタとして表現している。好みの問題っちゃ好みの問題なのですが、コンストラクタはC++の意味論に従ってくれるので。
2010-08-18 19:50:40どんなの?RT @SubaruG: 内部実装として継承や多態を使うことは、たまにある。けど、それを露出させることはしない。理由は、実装が変わったときにクライアントコードも変えなきゃいけないから。
2010-08-18 20:03:23ん、今考えると、ちょっと不適切ですね。抽象基底クラスを使った多態でも、別に複数の実装から実行時に多態しなければいけない理由はないですから。 RT @Rayerd: http://twitter.com/Rayerd/status/21481383702
2010-08-18 20:06:38pimpl と全く同じように使う(ただしポインタ経由)ことも普通にできる。その場合のデメリットはコピー関連だけですね。
2010-08-18 20:08:04とりあえず、 pimpl は、メンバとして持たせたポインタを どのように扱ってもいいし、そのことによって外部には(再コンパイルを含め)一切の影響がない。 つまり、最初は継承と多態を使ってたけど、効率的にあんまり相応しくない、ということが判明したら
2010-08-18 20:11:16外部に一切影響を与えずに、仮想関数を使わない形に書き換えることができる。どころか、実はメンバが整数一つだけだと判明したら、 reinterpret_cast でほげほげできる。
2010-08-18 20:12:12外部に一切影響を与えずに黒魔術を導入できる…このことをメリットと感じるのは少数派だと思いますが、僕にはメリットなのです。
2010-08-18 20:13:30最初は効率を無視して作り、後からあらゆる手段を使って効率を高める、ということが行いやすい。 そう、 pimpl ならね。
2010-08-18 20:14:11