c - 结构填充的规则是什么
问题描述
我浏览了 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
在 4 字节边界上对齐,但它少了 2 字节,因此填充计算为 2 字节:
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;
推荐阅读
- android - 由于清单合并,Gradle 同步失败
- java - 使用 SunEC 提供程序的 generateKeyPair 时出现运行时异常
- sql-server - 消除 SQL Server 上冗余唯一索引的唯一性是否有好处?
- excel - 在大型工作簿中单独循环遍历每一列
- linux - 计算字数并指定行数
- sorting - 为什么合并打印顺序相反
- r - 来自 geom_abline 的自定义 +/- 10% 波段?
- firebase - Flutter firestore 获取具有地图字段条件的文档
- io - 如何在fortran中直接将4字节数据读入8字节变量?
- c# - C# TcpClient 无法连接到简单的 python TCPIP 侦听器连接被拒绝,即使 docker 实例可以通信