首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的结构元素包含填充字节?

为什么我的结构元素包含填充字节?
EN

Stack Overflow用户
提问于 2015-01-08 14:00:16
回答 2查看 173关注 0票数 1

我有一个混乱的行为与内存对齐的结构元素。考虑这两种结构:

代码语言:javascript
运行
复制
typedef struct s_inner {
    unsigned long ul1;
    double        dbl1;
    fourth_struct s4;
    unsigned long ul2;
    int           i1;
} t_inner;

typedef struct s_outer {
    other_struct    member1; /* 4-byte aligned, 40 bytes in terms of sizeof() */
    unsigned long   member2;
    t_inner         member3; /* see above */
} t_outer;

当我检查t_outer的内存布局时,我可以看到member1的元素是4字节对齐的,正如我所期望的那样。此外,member3的内存布局与预期的一样:ul1有4个填充字节,因此dbl1在8字节的边框上对齐(在Win32上是正常的)。

然而,,当我检查member2的内存布局时,我可以看到这个成员有4个填充字节附加到它。有人能解释为什么member2会接收填充字节吗?我的期望是member2不带填充物。

编辑1:看到这个内存转储。在填充结构元素之前,我已经用memset‘s完成了整个t_outer结构:

  • 红色区域是member1
  • 蓝色区域是member2
  • 绿地是member3
  • 黄色区域标记dbl1member3中的位置。

约束

  • 编译器是VS2012
  • other_struct的实际结构不重要,它是一个40字节大小的4字节对齐结构
  • 我不想想要任何解决这个行为的方法(重新排序,打包,.)但是解释一下为什么会发生这种情况。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 14:58:40

使dbl1在8字节的边框上对齐。

好的。但是,这种对齐保证意味着如果结构本身也不对齐8,就意味着bupkis。这是一个通常由编译器为数据部分和堆栈帧的地址选择提供的保证。或者内存分配器。所有保证至少对齐到8。

但是,当您在s_outer中嵌入结构时,需要在member3 (而不是在member2之后)之前的4字节填充来获得对齐保证。

还请注意,结构可以在最后一个成员之后填充。以确保当结构存储在数组中时,成员仍然对齐。同样的理由。

票数 2
EN

Stack Overflow用户

发布于 2015-01-08 14:45:27

VS2012 docs 描述它的填充行为.特别是,它们指定struct的对齐需求是其任何成员中最大的对齐需求。成员member3的类型t_inner有一个double类型的成员,有一个8字节对齐的要求,因此member3总体上有一个8字节对齐的要求(并且t_outer有一个8字节对齐的要求)。member2member3之间需要填充以获得member3的8字节对齐。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27841898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档