2
class NoVirtual {
int a;
public:
void x() const {}
int i() const { return 1; }
};
class OneVirtual {
int a;
public:
virtual void x() const {}
int i() const { return 1; }
};
class TwoVirtuals {
int a;
public:
virtual void x() const {}
virtual int i() const { return 1; }
};
int main() {
cout << "int: " << sizeof(int) << endl;
cout << "NoVirtual: "
<< sizeof(NoVirtual) << endl;
cout << "void* : " << sizeof(void*) << endl;
cout << "OneVirtual: "
<< sizeof(OneVirtual) << endl;
cout << "TwoVirtuals: "
<< sizeof(TwoVirtuals) << endl;
return 0;
}
出力は次のようになります。サイズは、余分な4バイトに追加されます
NoVirtual:4
void *型:8
OneVirtual:16
TwoVirtuals:16
質問は:
OneVirtualからd TwoVirtualクラスは仮想関数を持ち、クラスのサイズはsizeof(int)+ sizeof(void *)、つまり12バイトでなければなりません。しかし、サイズは16バイトとして表示されます。
誰かが理由を説明できますか?
あなたは*アライメント*を忘れてしまいます。 [構造体のサイズが各メンバーのsizeofの合計と等しいのはなぜですか?](https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-各メンバーの和の和/ 119128) –
あなたは追加されたポインタを認識しているので、[これはあなたに啓蒙すべきです](https://stackoverflow.com/questions/119123/why-isnt-sizeofそれぞれのメンバーのサイズの和に等しい)を幾分かのものにすることである。しかし、直接的な答えではありません。 – StoryTeller