sizeof()
に関連する次の質問を受け取りました。
class C
{
public:
C();
virtual ~C();
unsigned char _member0 s[4];
static long _member1 d;
}
int main()
{
C vc;
cout << sizeof(vc);
}
sizeof()
この場合、関数がどのように評価されるかを誰かが説明できますか?
sizeof()
に関連する次の質問を受け取りました。
class C
{
public:
C();
virtual ~C();
unsigned char _member0 s[4];
static long _member1 d;
}
int main()
{
C vc;
cout << sizeof(vc);
}
sizeof()
この場合、関数がどのように評価されるかを誰かが説明できますか?
正確な答えはコンパイラによって異なる可能性があるため、厳密な意味での質問に対する答えは、これは実装定義です。
これがインタビュー Q (あなたの前の Q を見た) であることを考えると、次の点を指摘する必要がありました。
vptr
クラス インスタンスに追加する可能性があり、これによりサイズが増加する可能性があります。static
メンバーは、クラスのインスタンスではなくクラスに属しているため、クラス オブジェクトのサイズには寄与しません。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] | -------------------- ---------------
-----------------