3

良い時間です!

いくつかのコードを書きましたが、いくつかの奇妙なメモリ異常を理解できません。クラスの記憶に詳しい方、どなたか説明していただけないでしょうか?

私のコード:

#include <iostream>

using namespace std;

class O
{
    O();
    ~O();
};

class A
{
public:
    A();
    ~A();
    void someFunc();
private:
    int m_a;
};

class B: public A
{
public:
    B();
    virtual ~B();
private:
    int m_b;
};

class C: public B
{
public:
    C();
    ~C();
private:
    char m_c;
};

int main()
{
    cout << sizeof(char) << endl;
    cout << sizeof(int) << endl;
    cout << sizeof(O) << endl;
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    cout << sizeof(C) << endl;
    cin.get();
    return 0;
}

出力:

1  //normal for char
4  //normal for int on x32
1  //why empty class occupies 1 byte?
4  //int m_a.  Where is 1 byte?
12 //4B virtual function, 8B - m_a and m_b.
16 //char needs 1 byte. Why it gets 3 more?

注意と回答ありがとうございます )

4

2 に答える 2

1

O(空のクラス): クラスをアドレス指定するには、少なくとも 1 バイトのスペースが割り当てられている必要があります。1 バイト未満のものはアドレス指定できません。

A(単一の int メンバーを持つクラス): そのメンバーは、最大で 1 つの整数のスペースに相当します。必要なのはそれだけで、配置の問題はありません。

B(別の int メンバーと vtable を持つ派生クラス): 必要なスペースは、2 つの int と vtable の両方によって決まります。したがって、余分な 4 バイト (32 ビット マシン上の vtable へのポインター)。

'C' (別の文字を持つ派生クラス): からのすべてのものBと、1 バイト ( char) に加えて、適切に配置するためにさらに 3 つ含まれています。

于 2013-09-17T21:06:11.283 に答える