Index: [Article Count Order] [Thread]

Date:  Mon, 02 Feb 2004 15:04:46 +0900
From:  Murayama Toshikiyo <murayama@....jp>
Subject:  [XP-jp:04866] Re: GC
To:  extremeprogramming-jp@....jp
Message-Id:  <20040202145728.590C.MURAYAMA@....jp>
In-Reply-To:  <JN20040131123837.600648677@....jp>
References:  <20040131.111936.78221262.yamazaki@....jp> <JN20040131123837.600648677@....jp>
X-Mail-Count: 04866

村山@NETGENEです.

> Cでも型情報を持っていて色々やるコードというのはあります。SWIGなんかもそ
「型情報を手作業で付けることができる」というだけでしょ?
Cのランタイムにはそういう機能はありません.

> gomi = NULL;
> 
> と書くのも、
> 
> delete gomi;

念のため補足しておきますが,Javaのような言語では滅多に上記のようなことは
やりません.普通はスコープから外れた時点で何もせずとも参照は消えます.
null参照を明示的に代入するのはごく一部の例外的な場合のみです.特に
パフォーマンスのことを考えるならば,「明示的な代入は避けろ」とまで
言われています.(基本的に不要な処理であるため.)

もう一つ重要な点は,死んだオブジェクトが保持している参照の解放の必要はないという
ことです.あるインスタンスが死んだ時点で,インスタンスが他のインスタンスへの参照を
持っていようといまいと,その参照は無効になります.どれだけ複雑な参照関係があっても,
領域を開放するためにデストラクタなどを再帰的に呼びつづける処理を明示的に書く必要は
ないわけです.

特にマルチスレッドや並列処理ではインスタンスの生死を判断するのが格段に難しいです
からね.これをプログラマーに書かせるとなると負担が大きすぎます.Cにはマルチスレッド
機構がないから助かってるようなもので,マルチスレッド機能を持つJavaのような言語では
かなり厳しくなります.

> と書くのも、表現が異なるだけで、やりたいこともやる手間も変わらないんじゃ
> ないか、と思ったからです。C++だとgomiに入っているオブジェクトが参照して
というわけで,やる手間は実際にはかなり異なります.

例えばn分木の解放のような場合でも,せいぜい "root = null"と書くだけだし,
ほとんどの場合はそれさえ不要です.

-- 
村山敏清 株式会社ネットジーン 〒164-0001 
東京都中野区中野3-33-3 インツ中野ビル 5F
E-mail:murayama@....jp 
TEL:(03)5328-3670 FAX:(03)5328-3673
http://www.netgene.co.jp/