読者です 読者をやめる 読者になる 読者になる

仮想関数ポインタは4バイトとは限らない

呼べました。なんてあっさりと。。。
スタック上の値が0だったりCCだったりしたのはポインタのサイズが違ってて4バイト以上の余り部分が初期化されていないからなんでしょうね。
これをsquirrelに組み込んでみます。いままでuserpointerの自由変数でやってたからそこも変えないと。int×2とかにしてみますか。

#include <stdio.h>
#include <string.h>
//基底クラス
class aaa {
};
//squirrelへ登録するクラス
class bbb : public /*virtual*/ aaa {
public:
  bbb() {
    strcpy(msg,"yes!!\n");
  }
  virtual void echo() {
    printf("this=0x%08X\n",(uintptr_t)this);
    printf(msg);
  }
private:
  char msg[256];
};
//関数ポインタ型
typedef void (bbb::*fff)();
//関数ポインタデータ
struct nnn {
  int n[sizeof(fff)/sizeof(int)];
};
//実際に関数呼び出し
template<typename T>
void call( T* p, nnn x )
{
  union{
    nnn n;
    fff f;
  };
  n = x;
  (p->*f)();
}
//main
void main()
{
  printf("S=%d\n",sizeof(fff));
  
  bbb b;
  printf("&b=0x%08X\n",(uintptr_t)&b);
  union {
    fff f;
    nnn n;
  };
  f = &bbb::echo;
  call(&b,n);
}

ちなみに仮想継承にするとsizeof(fff)=12になりました。