Humanity

Edit the world by your favorite way

Structural Equivalence

またはStructure Equivalenceとか言うんだろうか。
検索しても日本語の資料がひっかからない。
「"structural equivalence" OR "structural equivalence" byte offset」とかするとようやく英語のページがひっかかる。


この言葉を知ったのはid:dmakiさんの「Perl 5 internalsの世界にようこそ」というプレゼンだった。
(当時Cあんまやってなかったので「へー」と思うだけだったけど。)


どんなのかっていうと、こんなの。

ようするに構造体のバイトオフセットが同じ位置のメンバについては共通の操作が行える、ということ。
変数はあくまでメモリ上の領域へのラベルなので。
(だけどやっぱりメンバの変数名は同じにしないとコンパイルエラー・・・当たり前か)

ただ当然構造体のバイトオフセットを揃える必要がある。
でないとSEGVる。
あとメンバが少ないとか多いとかも関係ない。オフセットが同じなら適用できる。


ちなみに「すぐ終了するので?」っていうのは最近のOSならプログラム中に確保されたメモリは終了時に全て解放されるとかいう話をどこかで聞いたから。(グダグダ言わねーでちゃんと書け)



まぁC++ならこのコードは

  • 共通のAPIを用意するならテンプレート、継承使え
  • char *よりstring使え
  • 自分でfreeせずデストラクタ用意しろ
  • 返り値でエラーチェックするより例外使え

ということなのかな。
わざわざreinterpret_castとかするまでもなく・・・