关于sizeof的奇怪之处

时间:2015-10-22 19:45:57

标签: c++

任何人都可以解释为什么objC的大小是8而不是12?

我认为,如果它在课程C中我有int类型的对象和AB - char,那么创建后对于objCobjAobjBObjC应为4个字节。

class A {
    char a;
};

class B : A {
    char b;
};

class C : B {
    int c;
};

int main()
{
    A objA;
    B objB;
    C objC;

    cout << sizeof(objA) << endl; // 1
    cout << sizeof(objB) << endl; // 2
    cout << sizeof(objC) << endl; // 8! Why not 12?

    return 0;
}

修改1:

在这种情况下,sizeof(objC)将为12:

class A {
    char a;
};

class B : A {
    int b; // Here is int
};

class C : B {
    char c; // Here is char
};

2 个答案:

答案 0 :(得分:5)

我相信class C会:

  • 2x 1字节字符
  • 2个字节的填充,因此int从4字节边界开始。
  • 1x 4字节整数
  • 总共8字节

要保持整数在边界上对齐,将有2个字节的填充,使 8个字节

你怎么得到12 ??

在您的第二个示例中,class C将包含:

  • 一个1字节的字符。
  • int之前的3个字节的填充。 (将int保持在4字节边界上)
  • 一个4字节的int。
  • 一个1字节的字符。
  • 总共9个字节。

大小向上舍入到最接近的4个字节,即12。

答案 1 :(得分:2)

在第一种情况下,有一个填充。在第二种情况下,有两个填充。

第一种情况是:

+---+---+---+---+---+---+---+---+
| a | b |   |   |     c         |
+---+---+---+---+---+---+---+---+
<-     4      ->|<-    4      ->|

第二种情况是:

+---+---+---+---+---+---+---+---+---+---+---+---+
| a |   |   |   |     b         | c |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+
<-     4      ->|<-    4      ->|<-    4      ->|