这个问题在这里已有答案:
我已经浏览了geeksforgeeks,https://www.geeksforgeeks.org/is-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member/中的结构填充帖但我不知道为什么在这种情况下:
int main()
{
struct C {
// sizeof(double) = 8
double z;
// sizeof(short int) = 2
short int y;
// Padding of 2 bytes
// sizeof(int) = 4
int x;
};
printf("Size of struct: %d", sizeof(struct C));
return 0;
}
我知道y(short int)后跟x(int),因此在y之后需要填充。但为什么这里的填充是2?
编译器想要将int
对齐在一个四字节的边界上,并且它比它短两个字节,因此填充计算为两个字节:
struct C {
// offset = 0
double z;
// offset = 8
short int y;
// offset = 10
// ... padding ...
// offset = 12
int x;
// offset = 16
};
下一个四个大于10的倍数是12。
编辑:在实践中,结构遵循此算法(伪代码):
offset = 0;
alignment = 1;
for each field in structure {
offset = (offset + field.alignment - 1) / field.alignment * field.alignment;
field.offset = offset;
alignment = lcm(alignment, field.alignment);
}
structure.alignment = alignment;
structure.size = (offset + alignment - 1) / alignment * alignment;