c - 什么时候结构没有填充?
问题描述
sizeof(x)
为下面的结构返回 2
struct s {
short c;
} x;
但对于结构
struct s {
short c;
char a;
} x;
sizeof(x)
退货4
,为什么?
第二个得到一个填充字节(假设 short 是 2 个字节长,char 是 1 个字节长)。那么第一个结构不应该有 2 个填充字节(因此是 4 个字节长)吗?
解决方案
填充的主要用途是根据硬件(或 C 实现的其他方面)的要求对齐结构成员。用于在结构中布局数据的算法在这个答案中。
要回答标题中的问题,结构什么时候没有填充:如果每个成员的对齐要求是所有先前成员的总大小和所有成员的总大小的除数,则结构不需要填充对齐。(AC 实现可能仍会出于对齐以外的原因添加填充,但这有点不寻常。)
对于您的示例,假设在 C 实现short
中,大小为两个字节并且需要两个字节对齐。根据定义,char
是一个字节并且需要一字节对齐。
然后,在struct s {short c;}
:
c
放在开头struct
。一开始从来没有任何填充。- 如果我们创建一个这些数组
struct
,下一个struct s
将比第一个开始两个字节,并且它的成员c
仍然是两个字节的倍数,所以它是正确对齐的。 - 因此,我们不需要任何填充来完成这项工作。
相比之下,在struct s {short c; char a;}
:
c
放在开头。a
后放置两个字节c
。这很好,因为a
只需要一个字节对齐。- 如果我们不添加任何填充,则大小
struct
为三个字节。然后,如果我们创建一个这些数组struct
,下一个struct s
将从开始的三个字节开始。 - 在那一秒
struct s
内,该c
成员将位于三个字节的偏移量处。这违反了short
. - 因此,要完成这项
struct
工作,我们必须添加一个字节的填充。这使得总大小为四个字节。然后,在这些数组中struct
,所有成员都将位于对齐所需的边界。
即使你只声明一个结构的单个对象,如在 中struct s {short c; char a;} x;
,结构总是被布置以便它可以在数组中使用。
推荐阅读
- mongodb - Mongodb聚合获取摘要
- c++ - 欧拉计划问题 4 的错误解决方案
- java-8 - 如何使用 Single vs Observables
- javascript - let 变量 JavaScript 的作用域
- c++ - while循环后如何继续阅读?
- jpa - 对实体内的列进行分组
- swift - 如果一个按钮被设置为触发到另一个视图控制器的 segue,如何可视化?
- php - 将输入类型从文本更改为多选下拉列表 - 技能分类
- angular - 管道未正确映射和错误处理 Angular
- python - 如何在 Keras 中将我的张量的 2D 子集与另一个 2D 张量分配?