在下面的结构中,我觉得大小应该是20,但它的结果是24。
class X {
unsigned int a;
unsigned int b;
double c;
unsigned int d;
};
为什么编译器不能从16-20个字节安排d
?
答案 0 :(得分:6)
这样c
在X
数组的8字节边界上保持对齐。
X x[2];
X[0]:
0-3 unsigned int a
4-7 unsigned int b
8-15 double c
16-19 unsigned int d
20-23 [PAD]
X[1]:
24-27 unsigned int a
28-31 unsigned int b
32-39 double c
40-43 unsigned int d
44-47 [PAD]
因此,您可以看到数组元素之间需要4个字节的填充。通过在对象的末尾添加4个字节来捕获它。如果第二个数组元素从位置20
开始,那么您会发现x[1].c
不是8字节对齐的。
所以,最后,d
确实按照您的预期从字节16开始,但d
的结尾不是对象的结尾。
答案 1 :(得分:1)
在像这样的POD结构中,struct
的地址是其第一个元素的地址。大小是类型X[]
的数组的连续元素之间的内存距离。要使double
在假设数组的第二个元素中对齐,第一个int
和整个struct
必须与double
的严格程度相对应。这需要在最后填充。
答案 2 :(得分:0)
您在哪个平台上运行?在我的ubuntu机器上它只给我输出20! sizeof unsigned int为4,double为8,这就是我的机器上输出为20 的原因 !! 这从硬件到硬件各不相同!!