gpt4 book ai didi

c - 为什么我的结构元素带有填充字节?

转载 作者:可可西里 更新时间:2023-11-01 11:18:12 26 4
gpt4 key购买 nike

我对结构元素的内存对齐有一个令人困惑的行为。考虑这两种结构:

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:请参阅此内存转储。在填充结构元素之前,我用 p 对整个 t_outer 结构进行了memset:

  • 红色区域是member1
  • 蓝色区域是member2
  • 绿色区域是member3
  • 黄色区域标记了 member3dbl1 的位置

memory-layout


约束

  • 编译器是VS2012
  • other_struct 的实际结构在这里无关紧要,它是一个 40 字节大小的 4 字节对齐结构
  • 想要针对该行为(重新排序、打包...)的任何解决方法,但希望解释为什么会发生这种情况。

最佳答案

so that dbl1 is aligned on an 8-byte border

当然。但是,如果结构本身也没有与 8 对齐,则对齐保证意味着 bupkis。这是编译器为数据部分和堆栈帧选择的地址通常提供的保证。或者内存分配器。都保证至少对齐到8。

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

另请注意,结构可以在最后一个成员之后进行填充。当结构存储在数组中时,可能需要确保成员仍然对齐。同样的原因。

关于c - 为什么我的结构元素带有填充字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com