C ++ - 应用于对象类的sizeof函数

时间:2012-08-30 07:00:26

标签: c++

我收到了与sizeof()相关的以下问题:

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

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

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

有人可以解释在这种情况下如何评估sizeof()函数吗?

2 个答案:

答案 0 :(得分:7)

确切的答案可能因编译器而异,因此从严格意义上说,问题的答案是 实现定义
考虑到这是一次面试Q(看到你以前的Q ),你应该指出以下几点:

  • 允许编译器向结构/类添加填充字节,这可能会增加大小。
  • 编译器可能会将vptr添加到类实例中,这可能会增加大小。
  • 班级成员将占用记忆。
  • static成员不会对类对象的大小做出贡献,因为它们不属于类的实例,而属于类。

答案 1 :(得分:0)

它给出了vc的大小。 vc是C类.C类的每个对象都包含元数据(指向vtable的指针),因为C包含虚方法。另外,C有一个数据字段(字符数组)。

因此vc的大小应该是指针的大小加上四个字节(加上填充,请参阅下面的评论,谢谢)。

d不是C类对象的组成部分,因为它是静态的,因此它不计算。

所以我们有:

------vc---------             ----vtable for C----           ----statics----
| ptr to vtable | ----------> | pointer to ~C    |           | C::d        |       
|---------------|             | ...              |           | ...         |
| char [4]      |             --------------------           ---------------
-----------------