c - 字节大小字段的结构填充和对齐?

标签 c padding memory-alignment

如果我有一个如下所示的结构,在 32 位机器上,结构中是否会有任何填充?据我了解,该结构会将所有内容与其最大的字段对齐,那么如果最大的字段是一个字节 (uint8) 怎么办?

struct s {
    uint8_t a[32];
    uint8_t b[64];
};

谢谢。

最佳答案

成员之间可能有填充。

C 标准 6.7.2.1(15):在结构对象中,非位域成员和位域所在的单元的地址按照它们声明的顺序递增。指向结构对象的指针经过适当转换后指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但不是在它的开头。

(14) 结构或 union 对象的每个非位域成员在实现中对齐 - 适合其类型的定义方式。

在现代机器上成员之间可能没有填充,但 C 不能保证,所以不要依赖它。

您可以使用 ofsetoff() 宏确定是否存在填充,然后使用静态断言对其进行管理。

关于c - 字节大小字段的结构填充和对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23859543/

相关文章:

html - 我调用哪个元素来提供填充或边距,以便底部有空间

CSS - 元素符号和列表之间的空间而不填充列表

html - 这个文本区域周围的额外空间在哪里?

c - 理解inotify示例中的对齐语句

c++ - 未对齐数据的操作速度

检查值是否在音叉反汇编中

c - 从 C 中的十个字符串列表中查找最长的字符串?

c - 我遇到段错误,但我不明白为什么

c - 使用 libgd 在 C 中逐帧操作 gif

c - Intel Intrinsics 的段错误