誰も私にここで何が起こっているのか説明できますか?まず、ほとんどのプログラマーは、仮想関数を持つクラスにはvtblがあることを知っているので、その上に余分な4バイトがあります。私が知る限り、それはかなり標準的です。私はこれをテストし、パッチされたvtblsを持つバイナリファイルから適切な場所にロードする前に、この事実を利用しました。過去6ヶ月間、私はXcodeで作業していましたが、ちょうどその場所で何らかの負荷をかける必要が出てきたので、もう一度vtblsにパッチを当てました。私の理解が正しいことを確かめるために、私はサンプルプログラムを書いた。ここにある:仮想関数を持つクラスのサイズGCC/Xcode
class A
{
public:
virtual int getData()
{
return a;
}
virtual void print()
{
printf("hello\n");
}
int a;
};
class B : public A
{
public:
int getData()
{
return b;
}
int b;
};
class C : public B
{
public:
int getData()
{
return c;
}
void print()
{
printf("world\n");
}
int c;
};
class D
{
public:
int a;
int b;
};
int main (int argc, const char * argv[])
{
A* tA = new A();
tA->a = 1;
printf("A: %d\n", sizeof(A));
printf("A data: %d\n", tA->getData());
B* tB = new B();
tB->a = 2;
tB->b = 4;
printf("B: %d\n", sizeof(B));
printf("B data: %d\n", tB->getData());
C* tC = new C();
tC->c = 8;
printf("C: %d\n", sizeof(C));
printf("C data: %d\n", tC->getData());
A* aC = tC;
aC->print();
printf("D: %d\n", sizeof(D));
return 0;
}
マイ期待出力された:
A:8
データ:1
B:12
Bデータ:4
C:16
Cデータ:8
世界
D:8
しかし、私は取得しています出力は次のようになります。
A:16
データ:1
B:16
Bデータ:4
C:24
Cデータ:8
世界
D:8
誰もがここで何が起こっているか任意のアイデアがありますか?ありがとう!
あなたは64ビットマシンにいますか? – robert
はい、私は - vtblが64ビットを占めるのですか? – alk3ovation
仮想テーブルはポインタです。すべてのポインタは8バイトを占有します。 – robert