Index: [Article Count Order] [Thread]

Date:  Sun, 1 Feb 2004 09:40:32 +0900
From:  Shibukawa Yoshiki <yoshiki@....jp>
Subject:  [XP-jp:04861] Re: GC
To:  extremeprogramming-jp@....jp
Message-Id:  <JW20040201094032.676364040@....jp>
In-Reply-To:  <20040201.040756.05783078.yyamano@....jp>
References:  <20040201.040756.05783078.yyamano@....jp>
X-Mail-Count: 04861

渋川です。

> SWIG って、全く知らないので教えてください。ここで書かれている
> スライシングってどういう意味なのでしょうか? 

C++は継承して新しいメンバー変数を追加したりすると、親クラスに追加したよ
うな形でメモリが子クラスの領域が確保されます。親も子もint型の変数を一個
ずつ定義していた場合には以下のような感じです。

  ポインタが指すアドレス
  ↓                    
  ┏━━━━┳━━━━┓
  ┃親の領域┃子の領域┃
  ┃4byte   ┃4byte   ┃
  ┗━━━━┻━━━━┛

それを親クラスにstaticキャストしたまま値コピーしたり、デストラクタ(非
virtual)でdeleteしようとすると子の領域がコピーされないで無視されたり、解
放されなかったりします。仮想関数を使っていて仮想関数テーブルを持っていて
多重継承をした場合にはさらに大変なことになります。それに関しては僕が前の
メールで紹介したVC++の実装詳細のページ(MSDNのやつ)の多重継承や仮想継承の
ところに出ています。

このあたりがややこしいのですが、関数テーブルを引く手間をできるだけ抑えて、
できることなら静的にアドレスを解決する、という目的でわざわざこうなってい
ると思います。速度最優先のチューニングです。

C++コンパイラの気持ち(速度優先)が少し分かればC++だって挙動がある程度読め
るようになってくるので、そこまでとっつきにくい言語ではないと思います。元
になっている思想はシンプルですから。ホンダのNSXみたいな感じ。こういうス
パルタンな部分が魅力的なんです。たまに苦労はさせられますけど。

> 戻すというのは、C、C++のコード側からスクリプト言語にオブジェクトを
> 戻すのでしょうか、あるいはその逆?

スクリプト言語側(void*で示されたメモリブロック)からC/C++側のオブジェクト
に戻すときです。メモリブロックになってしまうと型情報が失われてしまうので、
適切な型にキャストして意味情報を渡してやる必要がでてきます。

> トッパンから出ていた、C++オブジェクトモデルのふんちゃらっていう本はC++
> コンパイラの実装の話が詳しく書かれていて面白かったです。

もう買えないですよね。。トッパンは。。

----

東京工業大学  国際開発工学専攻  上田研
_/_/_/  しぶかわよしき JA6HFA/1 yoshiki@....jp
_/    http://www.shibu.jp  http://www.unittest.org