2

sizeof()に関連する次の質問を受け取りました。

class C
{
public:
    C();
    virtual ~C();

    unsigned char _member0 s[4];
    static long _member1 d;
}

int main()
{
    C vc;
    cout << sizeof(vc);
}

sizeof()この場合、関数がどのように評価されるかを誰かが説明できますか?

4

2 に答える 2

7

正確な答えはコンパイラによって異なる可能性があるため、厳密な意味での質問に対する答えは、これは実装定義です。
これがインタビュー Q (あなたの前の Q を見た) であることを考えると、次の点を指摘する必要がありました。

  • コンパイラは、パディング バイトを構造体/クラスに追加できます。これにより、サイズが増加する可能性があります。
  • コンパイラはvptrクラス インスタンスに追加する可能性があり、これによりサイズが増加する可能性があります。
  • クラス メンバーはメモリを占有します。
  • staticメンバーは、クラスのインスタンスではなくクラスに属しているため、クラス オブジェクトのサイズには寄与しません。
于 2012-08-30T07:07:28.737 に答える
0

vc のサイズを指定します。vc はクラス C です。クラス C には仮想メソッドが含まれているため、クラス C の各オブジェクトにはメタデータ (vtable へのポインター) が含まれます。さらに、C にはデータ フィールド (文字配列) があります。

したがって、 vc のサイズは、ポインターのサイズに 4 バイトを加えたサイズにする必要があります (さらにパディング、以下のコメントを参照してください)。

d は静的であるため、クラス C のオブジェクトのコンポーネントではなく、カウントされません。

したがって、次のようになります。

------vc---------             ----vtable for C----           ----statics----
| ptr to vtable | ----------> | pointer to ~C    |           | C::d        |       
|---------------|             | ...              |           | ...         |
| char [4]      |             --------------------           ---------------
-----------------
于 2012-08-30T07:04:34.840 に答える