sizeof():一个类的大小与它的成员大小不一样?

时间:2010-10-09 18:15:33

标签: c++ char sizeof pointers

首先,在我的系统上执行以下操作:sizeof(char) == 1sizeof(char*) == 4。 所以简单地说,当我们计算下面课程的总大小时:

class SampleClass { char c; char* c_ptr; };

我们可以说sizeof(SampleClass) = 5。但是,当我们编译代码时,我们很容易看到sizeof(SampleClass) = 8

所以问题是“计算问题在哪里?” :S

  • 语言:C ++
  • 编译器:gcc 4.4.0
  • 操作系统:Tinycore

2 个答案:

答案 0 :(得分:4)

编译器通常在结构中添加填充以使它们在字边界上对齐(因为访问字对齐的位置需要更少的内存访问,因此更快)。

因此,即使char仅占用1个字节,c_ptr也会转移到下一个4字节边界,因此产生8个字节的结果。

答案 1 :(得分:3)

这是由填充引起的 编译器正在添加填充:

  • 尽快访问会员
  • 还可以创建对象包的数组,以便对元素的访问有效。

因此,大小为1的对象可以与1个字节的边界对齐,并且仍然可以轻松/高效地读取。虽然大小为4的对象需要在4字节边界上对齐(适合您的编译器(从技术上讲,您可以对齐1个字节的边界,但这意味着您通常需要多个指令来提取和组合,因此写入4字节边界更有效。)。

因此,为了实现结构的最佳对齐,最好按尺寸(最大的第一个)订购成员。这将为您提供最佳正常情况下的最佳包装策略。

这不会阻止您的对象为八个字节 由于编译器还考虑到您的类可能在数组中使用。因此,数组中的每个元素都需要对齐,以便每个元素的最大成员都适当对齐。