真夜中のpImplトーク

という名の@SubaruG先生オンステージ
7
普通のC++使い、銀天すばる @SubaruG

最初からPimpl側に this を渡しとくとか。

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

やはり継承より包含を使うべき。うむ。

2010-04-04 23:39:43
隅須正昭 @nagoya313

ん~と、前方宣言のみのクラスのスマポは消滅するときに何を消しているのかが謎ですな。

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

継承を使いたい場合は pure virtual な物に限った方が良さそう。

2010-04-04 23:40:45
若年寄(もう若くない) @kikairoya

継承はインタフェースの再利用で、pimplはインタフェースと実装の分離だからある意味しょーがない気もする。二重に継承階層を管理しないといけないのは避けようが無い RT @SubaruG: っていうか、今思ったけど、継承とpimplって物凄く相性悪いよね。 Pimpl側の実装関数に

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

@nagoya313 incompleteなクラスへのポインタに対するdeleteは未定義ですにゃー。

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

boost::scoped_ptr に格納されるポインタは、boost::scoped_ptr が「インスタンス化されたときに」incompleteな場合、コンパイルエラーになります。

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

pimplの場合、コンストラクタは全て実装側の定義なので、その時点ではscoped_ptrに格納されるクラスは完全型だから問題無し。

2010-04-04 23:45:35
隅須正昭 @nagoya313

流石C++。伝家の宝刀動作未定義!

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

ただ、デストラクタの宣言を忘れると、コンパイラによって自動定義されたデストラクタが、ヘッダ部分に生成されて、その時点ではincomplete だから、コンパイルエラーになる。

2010-04-04 23:46:34
隅須正昭 @nagoya313

へ~。そういう原理だったのか RT @SubaruG: ただ、デストラクタの宣言を忘れると、コンパイラによって自動定義されたデストラクタが、ヘッダ部分に生成されて、その時点ではincomplete だから、コンパイルエラーになる。

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

shared_ptr の削除子は実行時解決されるので、その辺は問題ないんだけど…正直、実行時に解決されるのはコスト的にどうなの、と。

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

しかもshared_ptrはnoncopyableじゃないから、コピーコンストラクタと代入演算子を明示的に殺さないとひどい目にあうし。

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

というわけで僕はscoped_ptr推進派です。shared_ptrも悪くないけど。生ポインタだけは勘弁。

2010-04-04 23:51:16
ほっと @hotwatermorning

でもunique_ptrじゃないとreleaseできない... RT @SubaruG: というわけで僕はscoped_ptr推進派です。shared_ptrも悪くないけど。生ポインタだけは勘弁。

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

pimpl使っている以上、どっかでインスタンスを破棄しなきゃいけないのは変わらないのです。デストラクタを自前で用意しなきゃいけない面倒さを嫌う人は shared_ptr を使えばいいし、実行時パフォーマンスを気にするならscoped_ptrを使えばいい。好みの問題。

2010-04-04 23:53:26
ほっと @hotwatermorning

あ、pimplのはなしかorz RT @hotwatermorning: でもunique_ptrじゃないとreleaseできない... RT @SubaruG: というわけで僕はscoped_ptr推進派です。shared_ptrも悪くないけど。生ポインタだけは勘弁。

2010-04-04 23:54:29
Egtra (ysk-noh) @egtra

@SubaruG 逆に言えば、参照カウントによる共有のセマンティクスが自動的に実現されるのが利点となる場合もあると言えると思います。

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

@egtra immutableな場合はそれでいいんですけど、mutableな場合は誤解のもとになりますからねー。

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

逆に考えるんだ。 noncopyable な shared_ptr があってもいいじゃない、そう考えるんだ。

2010-04-04 23:56:57
ほっと @hotwatermorning

ですよねー RT @SubaruG: @hotwatermorning releaseは必要ないですし。

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

ってそれ、 std::unique_ptr<T, std::funtion<void(T*)>>とどう違うの、ってね。

2010-04-04 23:58:38