「参照カウンタは最大停止時間が短い」は正しい。「参照カウンタはメモリ使用量のピークが低い」も大体あってる。でも、「参照カウンタは全停止時間が短い」や「参照カウンタは平均メモリ使用量が少ない」とは言えないよね
2010-12-08 19:58:27参照カウントGCは、デストラクタの起動とメモリ開放を別にできれば最強のような。デストラクタは今のままでいいから、結局は、制御可能なmalloc/freeがあればいい。とここまで書いて、古典的な話ですね。
2010-12-08 21:39:58@meiamipapa unique という名前のとおり、たかだか一つの所有権しか持たないですけど、大体はそれで十分なので。
2010-12-08 22:42:51@meiamipapa 参照カウントを持つ場合、本体とは別にどっかにカウントを覚えないとだめですよね? それってオーバーヘッドじゃないですか。
2010-12-08 22:44:06@meiamipapa 所有権が一つしかなければ、参照カウントをどっかで管理する必要もないし、参照カウントの書き換え(間接参照とかで結構コスト高い)をする必要もない。
2010-12-08 22:45:01と、返信したところで早速すばる先生!w で、それを「メモリ管理の問題」一般に広げた場合、どういった意味になるんでしょうか? あ、なんかイミフなこと言ってる気がするんで、するーでも。
2010-12-08 22:46:07@meiamipapa std::unique_ptr は、「使った物を忘れずに片付ける」って機能しかもちませんよ。それだけです。
2010-12-08 22:47:45@meiamipapa つたない説明ですが、この「基本的な使い道」でちょっと触れてます。 http://bit.ly/gpwJGM
2010-12-08 22:52:27@SubaruG はい、それはよくわかっています。えっと、「std::unique_ptr を使えばメモリ管理の問題ってほぼ全て片付くはず」の「メモリ管理の問題」がどれくらいの範囲なのかな? と思った次第です。難しい質問とは思いますが・・・。
2010-12-08 22:52:54@meiamipapa とりあえず boost::intrusive_ptr で扱ってた部分は全部解決しますよね。
2010-12-08 22:53:53@meiamipapa つまりオブジェクト自身が自身の破棄方法を知っている場合ですね。実際に破棄が行われるかは別問題ですが、構築時に add_ref し(これは手動で行う必要があるが、 unique_ptr はコピー出来ないので問題ない)、削除子で release させればいい。
2010-12-08 22:55:51@meiamipapa んで、その他のパターンである、構築時に何かのパラメータを覚えておいて、そのパラメータを元に破棄する、って場合でも、普通に unique_ptr の削除子に覚えさせておけばいいから問題ない。
2010-12-08 22:56:40@meiamipapa 毎回削除子の型を指定するのが面倒かというと、 C++0x には auto があるので、その辺は苦になりません。もし型を消したい場合には std::shared_ptr にいつでも変換できますし。
2010-12-08 22:58:05@SubaruG はい、自身が知っているのはunique_prt|shared_prt の特性?として理解しています。えっと、なんだっけ、GCネタとして、その回収コストのお話があったと思うんですが、やはりそのあたりも解決する可能性がありますかね。
2010-12-08 23:00:39@meiamipapa 参照カウント以外のGCに対しては本質的に向いてないですね。所有権等概念自体が希薄ですし。
2010-12-08 23:01:36@meiamipapa ただ、C++を使うにあたって、明示的に所有権を扱うより優れたメモリ管理方法って、そうそうないと思うのですが、どうでしょう。
2010-12-08 23:02:29@SubaruG やはり、そういうことになりますか。ありがとうございます。RAIIのない言語とある言語、ゴミ回収の意味が違いますよね。我々にとってはゴミは最終的にはメモリです。デストラクタのコストはゴミではない?。結局、グローバルなoperator new/deleteすかね!
2010-12-08 23:08:07@meiamipapa C++ では任意のリソースを管理しますからね。メモリに限らずファイルやスレッド、ミューテックス、 etc...
2010-12-08 23:10:10