在下面的结构中,我觉得大小应该是20,但它现在是24.
class X {
unsigned int a;
unsigned int b;
double c;
unsigned int d;
};
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能安排d16-20个字节?
这样就可以c在数组的8字节边界上保持对齐X.
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]
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到数组元素之间需要4个字节的填充.通过在对象的末尾添加4个字节来捕获它.如果第二个数组元素从位置开始20,那么你会发现它x[1].c不是8字节对齐的.
所以,最后,d确实按照您的预期从字节16开始,但结束d不是对象的结束.