09/04/09 12:01:34
そろそろ1000か。ところで、このスレの過去ログを全部保存しているサイトとかってないのかな?
時々ググって引っかかったけどdat落ちしてたりとか、過去のこの辺で出てたよな、とかそういうの
あるんだけど。
972:デフォルトの名無しさん
09/04/09 12:03:17
過去ログ見ろとか言われても困るよなw
973:デフォルトの名無しさん
09/04/09 12:57:43
boost::shared_ptr<Test> MemberFunction();
boost::shared_ptr<Test>& MemberFunction();
あるクラスが、内部にTestのスマポを持っていて、それを返す関数があるとします。
(名前はMemberFunction)。
このとき、参照で返すのと、実体で返すのとは、どう違うでしょうか?
自分は、スマポを返す場合は参照以外はないと思ってたんですが、実体を
返すことに意味はあるでしょうか?
974:デフォルトの名無しさん
09/04/09 13:14:58
参照を返したら外部からインスタンス内部のポインタをresetできる。
コピーインスタンスを返したら、外部のスマポは外部のポインタだけ変更できる。
975:デフォルトの名無しさん
09/04/09 13:20:34
>>974
外部から触って欲しくない時にはコピーインスタンスを返すべきということですか?
でも、そうなると内部で保持しているスマポはboost::scoped_ptr<>を使うべきでは
ないですか?
976:デフォルトの名無しさん
09/04/09 14:42:25
scoped_ptrだと、呼び出し元がポインタを得た後、「あるクラス」のインスタンスが変更受けた場合に、
呼出し元が破棄されたポインタを持たされる危険がある。
というか内部実装にscoped_ptrを用いる場合はTestをコピーして返すべき。
そもそもスマポは、Testインスタンスを参照する手段であって、
MemberFunctionもTestを渡すのにスマポを用いてるだけで、Testの参照の参照を返すのは本来的に無意味。
977:デフォルトの名無しさん
09/04/09 20:46:08
スマポってセマンティクスはポインタだからな
Test*& MemberFunction();
と同じ事をしようとしてる
978:デフォルトの名無しさん
09/04/09 20:57:10
>>975
コピーをお前はTest自体のコピーと考えているように見えて、
974はshared_ptrのコピーのことを指しているように見えるぞ。
979:デフォルトの名無しさん
09/04/09 21:17:13
&じゃなくてconst&ならありなんじゃね?
値をコピーすると参照カウンタの操作が入って遅いだろうし。
980:975
09/04/09 22:10:14
でもスマポ(特にboost::shared_ptr<>)の参照を返すコードって結構ないですか?
スマポのコピーって本当に遅いし。測ったら普通のポインタのコピーより
30倍近く時間がかかってました。
でも本当は無意味で、979さんの言うとおりconst&の時だけ意味があるのかな?
981:デフォルトの名無しさん
09/04/09 23:02:14
速度を本当に気にするような場面ならそもそもスマポを使うな。
しかし、ほとんどの場合においてスマポのコピー程度の時間は全く問題にならない。
30倍と言うが、ポインタのコピーなんて機械語で一命令になるかならないかのレベルなんだから、
それが30倍になろうとも余程の大量コピーでない限り全く気にならない。
982:デフォルトの名無しさん
09/04/09 23:06:31
shared_ptrの参照を返すことなんてまず無いな。むしろコピーしてなんぼだ。
そもそもオブジェクトが何かの参照を返す事自体問題がある。
983:975
09/04/10 01:02:41
そうなんですか。。。
実は自分が今やってるプロジェクトでは、boost::shared_ptr<>&返し
(スマポの参照返し)を使いまくってて、自分もそれに合わせて書いてるんですが、
最初にスマポの参照返しを使い始めた人はもうプロジェクトにはいないし、
なんでかなとおもってたのですが。、。
984:デフォルトの名無しさん
09/04/10 01:24:38
スマポの参照返すくらいなら普通に参照返せばいいんじゃ?
985:デフォルトの名無しさん
09/04/10 01:37:00
ぬるりーは怖いぜよ
986:デフォルトの名無しさん
09/04/10 02:03:51
返ってきたスマポの参照が本当に有効なスマポを指してるのか
知らない間に外からいじくられないか
いつまで生きてることが保証されてるのか
そもそもスマポってこんなこといちいち気にしたくないから使うもんのはずだ
危ないことしたくないからわざわざ重いスマポ使ってるのにそんなことするなんて
ストーブ炊いて暑いからってクーラーかけるようなもの
馬鹿げてる
987:デフォルトの名無しさん
09/04/10 02:26:16
ぬるぽは怖いぜよ
988:975
09/04/10 06:56:20
じゃあやっぱり最初にスマポの参照返し使いまくりをはじめた人に聞いてみたほうがいいのかな。。。
ソースを見る限り、間違いなくC++の達人だと思ったので、そのやり方にしたがってれば間違いない
と思ったんだよな。
ちょっと聞いてみます。
989:デフォルトの名無しさん
09/04/10 07:25:22
30倍遅いっても怪しい感じだな
そんなに遅くなるか?
誰か試してくれ
990:デフォルトの名無しさん
09/04/10 07:28:34
991:デフォルトの名無しさん
09/04/10 08:19:19
shared_ptrなら、コピー時の参照数の管理コストを無視できない、かも。