渋川です。
> 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