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

C++ C++;-应用于对象类的sizeof函数,c++,C++,我收到了以下与sizeof()相关的问题: C类 { 公众: C(); 虚~C(); 无符号字符成员0 s[4]; 静态长成员1d; } int main() { vc; cout它给出了vc的大小。vc属于C类。C类的每个对象都包含元数据(指向vtable的指针),因为C包含虚拟方法。此外,C还有一个数据字段(字符数组) 因此,vc的大小应该是指针大小加上四个字节(加上填充,请参阅下面的注释,谢谢) d不是C类对象的组件,因为它是静态的,所以不计算 因此,我们: ------vc-------

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

C类
{
公众:
C();
虚~C();
无符号字符成员0 s[4];
静态长成员1d;
}
int main()
{
vc;

cout它给出了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]      |             --------------------           ---------------
-----------------

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

  • 允许编译器向结构/类添加填充字节,这可能会增加大小
  • 编译器可能会将
    vptr
    添加到类实例中,这可能会增加大小
  • 类成员将占用内存
  • static
    成员不影响类对象的大小,因为它们不属于类的实例,而是属于类

它是实现定义的,但这里基本上是当前字段+vtable指针+需要的任何对齐填充。诀窍是添加vtable指针,但排除静态成员。指向Dan Saks讨论类存储布局的文章的链接。可能会补充以下答案。
sizeof
不是函数,它是运算符。从形式上讲,它是未指定的,不是实现定义的。实现定义意味着实现必须记录它所做的事情。
------vc---------             ----vtable for C----           ----statics----
| ptr to vtable | ----------> | pointer to ~C    |           | C::d        |       
|---------------|             | ...              |           | ...         |
| char [4]      |             --------------------           ---------------
-----------------