2017-12-25 16 views
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バイトとして表示されます。

誰かが理由を説明できますか?

+0

あなたは*アライメント*を忘れてしまいます。 [構造体のサイズが各メンバーのsizeofの合計と等しいのはなぜですか?](https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-各メンバーの和の和/ 119128) –

+0

あなたは追加されたポインタを認識しているので、[これはあなたに啓蒙すべきです](https://stackoverflow.com/questions/119123/why-isnt-sizeofそれぞれのメンバーのサイズの和に等しい)を幾分かのものにすることである。しかし、直接的な答えではありません。 – StoryTeller

答えて

3

int型のサイズは64ビットマシンのポインタサイズのため4bytes.Typicallyあるので、私はあなたが64ビットマシンでコンパイルされていると仮定は8バイト、int型のサイズになります4 bytes.Toで読みサイクルを節約するためにData Alignment requirementを満たす コンパイラは(余分な4つのバイトを追加したがって、実際の必要サイズが12バイトの場合、結果は16バイトになります。

関連する問題