smart_ptr refcount GC

最終的にすばる先生が作る流れになっている…
1
若年寄(もう若くない) @kikairoya

なんとなくrefcountをGCとしては認めたくないような

2010-12-08 19:53:50
若年寄(もう若くない) @kikairoya

「参照カウンタは最大停止時間が短い」は正しい。「参照カウンタはメモリ使用量のピークが低い」も大体あってる。でも、「参照カウンタは全停止時間が短い」や「参照カウンタは平均メモリ使用量が少ない」とは言えないよね

2010-12-08 19:58:27
若年寄(もう若くない) @kikairoya

循環参照があることを前提にするとそもそもデストラクタの類に強い制限がかかる

2010-12-08 20:00:59
@meiamipapa

参照カウントGCは、デストラクタの起動とメモリ開放を別にできれば最強のような。デストラクタは今のままでいいから、結局は、制御可能なmalloc/freeがあればいい。とここまで書いて、古典的な話ですね。

2010-12-08 21:39:58
@meiamipapa

要らなくなった瞬間にゴミは捨てる。それは特殊な場合を除いて正しい。へんなところで、しかも制御不能に、GCが走るより100倍いいです。

2010-12-08 21:51:08
普通のC++使い、銀天すばる @SubaruG

std::unique_ptr を使えばメモリ管理の問題ってほぼ全て片付くはず。

2010-12-08 22:38:20
@meiamipapa

@SubaruG それは理想の参照カウントGCといった意味でしょうか?

2010-12-08 22:40:01
@meiamipapa

@SubaruG 所有権としての意味では同じかと思うんですが、もっと深い意味論があるんでしょうねえ・・・。

2010-12-08 22:42:51
普通のC++使い、銀天すばる @SubaruG

@meiamipapa unique という名前のとおり、たかだか一つの所有権しか持たないですけど、大体はそれで十分なので。

2010-12-08 22:42:51
普通のC++使い、銀天すばる @SubaruG

@meiamipapa 参照カウントを持つ場合、本体とは別にどっかにカウントを覚えないとだめですよね? それってオーバーヘッドじゃないですか。

2010-12-08 22:44:06
普通のC++使い、銀天すばる @SubaruG

@meiamipapa 所有権が一つしかなければ、参照カウントをどっかで管理する必要もないし、参照カウントの書き換え(間接参照とかで結構コスト高い)をする必要もない。

2010-12-08 22:45:01
@meiamipapa

と、返信したところで早速すばる先生!w で、それを「メモリ管理の問題」一般に広げた場合、どういった意味になるんでしょうか? あ、なんかイミフなこと言ってる気がするんで、するーでも。

2010-12-08 22:46:07
普通のC++使い、銀天すばる @SubaruG

@meiamipapa std::unique_ptr は、「使った物を忘れずに片付ける」って機能しかもちませんよ。それだけです。

2010-12-08 22:47:45
普通のC++使い、銀天すばる @SubaruG

@meiamipapa つたない説明ですが、この「基本的な使い道」でちょっと触れてます。 http://bit.ly/gpwJGM

2010-12-08 22:52:27
@meiamipapa

@SubaruG はい、それはよくわかっています。えっと、「std::unique_ptr を使えばメモリ管理の問題ってほぼ全て片付くはず」の「メモリ管理の問題」がどれくらいの範囲なのかな? と思った次第です。難しい質問とは思いますが・・・。

2010-12-08 22:52:54
普通のC++使い、銀天すばる @SubaruG

@meiamipapa とりあえず boost::intrusive_ptr で扱ってた部分は全部解決しますよね。

2010-12-08 22:53:53
普通のC++使い、銀天すばる @SubaruG

@meiamipapa つまりオブジェクト自身が自身の破棄方法を知っている場合ですね。実際に破棄が行われるかは別問題ですが、構築時に add_ref し(これは手動で行う必要があるが、 unique_ptr はコピー出来ないので問題ない)、削除子で release させればいい。

2010-12-08 22:55:51
普通のC++使い、銀天すばる @SubaruG

@meiamipapa んで、その他のパターンである、構築時に何かのパラメータを覚えておいて、そのパラメータを元に破棄する、って場合でも、普通に unique_ptr の削除子に覚えさせておけばいいから問題ない。

2010-12-08 22:56:40
普通のC++使い、銀天すばる @SubaruG

@meiamipapa 毎回削除子の型を指定するのが面倒かというと、 C++0x には auto があるので、その辺は苦になりません。もし型を消したい場合には std::shared_ptr にいつでも変換できますし。

2010-12-08 22:58:05
@meiamipapa

@SubaruG はい、自身が知っているのはunique_prt|shared_prt の特性?として理解しています。えっと、なんだっけ、GCネタとして、その回収コストのお話があったと思うんですが、やはりそのあたりも解決する可能性がありますかね。

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

@meiamipapa 参照カウント以外のGCに対しては本質的に向いてないですね。所有権等概念自体が希薄ですし。

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

@meiamipapa ただ、C++を使うにあたって、明示的に所有権を扱うより優れたメモリ管理方法って、そうそうないと思うのですが、どうでしょう。

2010-12-08 23:02:29
@meiamipapa

@SubaruG やはり、そういうことになりますか。ありがとうございます。RAIIのない言語とある言語、ゴミ回収の意味が違いますよね。我々にとってはゴミは最終的にはメモリです。デストラクタのコストはゴミではない?。結局、グローバルなoperator new/deleteすかね!

2010-12-08 23:08:07
普通のC++使い、銀天すばる @SubaruG

@meiamipapa C++ では任意のリソースを管理しますからね。メモリに限らずファイルやスレッド、ミューテックス、 etc...

2010-12-08 23:10:10