boost::optional<T&>の話
boost::optional<T&>「じゃないとダメ」って局面はめったにないけど、気軽に使えると嬉しいのは確か。
2011-02-15 00:11:48@SubaruG boost::optional<T&> かー。なるほど。これはそういう場面ではよく使われてる手段なんですか?(何となく、最後の手段的な臭いがする気がするw
2011-02-15 00:20:17@rshhh 例えば、あるコンテナの中から、ある要素を検索したい。でもその要素があるかどうかは実際に検索してみないと分からない。そういう場合に使うものです。
2011-02-15 00:24:12@rshhh ただし弱点があって、実質的に生ポインタであるにもかかわらず、生ポインタよりメモリサイズも実行時コストも大きいという…。
2011-02-15 00:31:21@rshhh 意図は明確になるし、 & 演算子が多重定義されてても使えるし、うっかり delete とかも有り得ないので、コストが気にならなければ普通に便利に使えます。コストが上乗せっていっても、動的メモリ確保するとかじゃないので誤差の範囲ですしね。
2011-02-15 00:32:34@rshhh ですです。ただ、これは本来は省けるコストなので、参照の場合に最適化されてないのはちょっと残念なんですよね。だから標準に入って欲しかったなぁ、標準なら効率も気にするだろうし、というのが本音です。
2011-02-15 00:42:32@SubaruG 「本来は省ける」のをわかった上で割りきって使うのなら、便利で安全だし生ポインタで生じるリスクとかも無い、と。標準に入って最適化がかかるっていうのを期待するのはちょっと違うかなぁとも思いますが、根本的な解決法がまだないあたり、それが現状でのベストなんでしょうね・・
2011-02-15 00:49:15@rshhh 根本的な解決はありますよ。 Boost にパッチを送ればいいのです。誰も面倒がってやってないだけで、解決事態は簡単なので。
2011-02-15 00:50:19@rshhh http://bit.ly/9MSBt3 これですね。なんで僕がパッチを送らないかというと、 Boost.Optional って古いコンパイラの対応がきっちりしてるライブラリなので、その辺に対応するのが面倒だという。
2011-02-15 00:52:23@SubaruG エントリのコメント欄とgistのソース含め全部読みました。これ、この後どうなったのかが非常に気になるw 個人的には、これはこれで別のクラスとして作りこんでいく方向に賛成ですが。
2011-02-15 01:05:22@rshhh C++0x対応をしなければ、これはこれで既に完成されてるので、僕としてはバグが見つからない限りは特に直すつもりはないですね。
2011-02-15 01:09:41@SubaruG ところで、(分かっている前提で話をしていた所申し訳ないんですが)optionalは構築されたかどうかを保持する変数があるのに対して、これは内部ではboost::addressofでアドレスを取って保持しているだけなのでそこが無い、っていう認識で大丈夫でしょうか。
2011-02-15 01:23:16@rshhh はい。 well-defined なプログラムでは、 NULL に対する参照というのは存在しないので、無効値は NULL ポインタを使って表しています。
2011-02-15 01:24:42@rshhh あともう一つ、 boost::optional<T&> はデストラクタがユーザ定義されているので、色々とコンパイラの最適化を阻害するんですよね。その点も改善点なので、デストラクタは定義してありません。
2011-02-15 01:25:49