首先,在我的系统上执行以下操作:sizeof(char) == 1
和sizeof(char*) == 4
。
所以简单地说,当我们计算下面课程的总大小时:
class SampleClass { char c; char* c_ptr; };
我们可以说sizeof(SampleClass) = 5
。但是,当我们编译代码时,我们很容易看到sizeof(SampleClass) = 8
。
所以问题是“计算问题在哪里?” :S
答案 0 :(得分:4)
编译器通常在结构中添加填充以使它们在字边界上对齐(因为访问字对齐的位置需要更少的内存访问,因此更快)。
因此,即使char
仅占用1个字节,c_ptr
也会转移到下一个4字节边界,因此产生8个字节的结果。
答案 1 :(得分:3)
这是由填充引起的 编译器正在添加填充:
因此,大小为1的对象可以与1个字节的边界对齐,并且仍然可以轻松/高效地读取。虽然大小为4的对象需要在4字节边界上对齐(适合您的编译器(从技术上讲,您可以对齐1个字节的边界,但这意味着您通常需要多个指令来提取和组合,因此写入4字节边界更有效。)。
因此,为了实现结构的最佳对齐,最好按尺寸(最大的第一个)订购成员。这将为您提供最佳正常情况下的最佳包装策略。
这不会阻止您的对象为八个字节 由于编译器还考虑到您的类可能在数组中使用。因此,数组中的每个元素都需要对齐,以便每个元素的最大成员都适当对齐。