山崎です.
渋川さん:
> > C++の言語仕様によると,あるメモリ領域がどの型なのか知る手段がありませ
> > ん.また,一般的なC++コンパイラは,型情報を記録することをしていません.
> > したがって,実際には int の 100 が入っている領域も,100番地というポイ
> > ンタが入っているのかもしれないと「保守的に」扱う必要があります.
>
> Cでも型情報を持っていて色々やるコードというのはあります。SWIGなんかもそ
> うです。SWIGの場合はスクリプト言語とC/C++コードのコミュニケーションのた
> めに持っているのであってGCのためではないですけど。
SWIG については詳細をよく知りません.よろしかったら,詳しく聞かせてい
ただけないでしょうか?
> あとはスマートポインタ
> の類も型情報を持っているからこそ参照カウントで消せるといえると思います。
> 僕とεπιさんが紹介したBoehm GCは保守的GCだけではなく、ポインタ情報も使
> 用しているようです。new/mallocなんかをオーバーライドするには少なくとも
> 「確実にポインタであるもののデータベースを作る」という意図があるからです。
それはその通りですね.確実にポインタだと分かっていれば,いろいろとやれ
ることはあるでしょう.問題は,Cや C++ をそのまま使うと,ポインタなのか
そうでないのか分からないメモリ領域が存在するために,保守的な GC を行う
必要があることです.
> ところでRubyってexact GCでしたっけ?僕の記憶では違った気がします。マーク
> &スイープの保守的なGCだったと思います。
念のため言いますが,exact GC という言葉は保守的GCの逆,つまり型情報が
全てそろっている前提で行う GC のことです.Ruby が実際に exact GC を使っ
ているかどうかは僕もよく知りませんが,僕のメールにありますように,
> Ruby, Python, Java の実装は,オブジェクトの構造体に型情報を記録してい
> ます.したがって C で書かれているにもかかわらず,exact GC を使うことが
> できます.
つまり exact GC を採用することが原理的に可能だという以上のことは言って
いません.
> > > そのルートのオブジェクトの参照を断つというのと、C++のオブジェクトを
> > > deleteするように気をつける、というのは同義だと思います。
> >
> > 同義ではありません.C++ の delete はそのオブジェクトへの参照が完全に存
> > 在しなくなる場合だけ行う必要があります.一方,オブジェクトの参照を断つ
> > というのは,メソッド等の中でそのオブジェクト利用することがなくなった場
> > 合に行います.これは,よそで使われているかどうかは関係なく行えます.
>
> shared_ptrでは他に参照しているポインタが存在したらdeleteを遅延してくれま
> すので単純にそうでもないと思います。
shared_ptr を使えば確かにそうですね.
# いろいろ調べてみると,C++ も最近は結構進化しているのですね.
> 僕が同義だと言ったのは、もう使わない、
> gomiという名前の変数に格納されたオブジェクトがあったとして、
>
> gomi = NULL;
>
> と書くのも、
>
> delete gomi;
>
> と書くのも、表現が異なるだけで、やりたいこともやる手間も変わらないんじゃ
> ないか、と思ったからです。C++だとgomiに入っているオブジェクトが参照して
> いる他のオブジェクトも道連れにするにはそういうコーディングをする必要はあ
> りますけどね。それもほとんどの場合は
>
> Nakama* 道連れ;
>
> というのを
>
> shared_ptr<Nakama> 道連れ;
>
> と書き換えればおしまいだと思います。
そういう意図で「同義だ」と言ったのであれば,それは同意します.
# 先のメールは僕にはそのように読めませんでした.僕の日本語読解力の問題かも.
> # 参照を断つ、というのは前者の表現のことですよね?
前者=「NULLを代入する」という意味なら,その通りです.
山崎 進 --- yamazaki@....jp
福岡県産業・科学技術振興財団
福岡知的クラスター研究所