【发布时间】:2023-03-18 22:40:01
【问题描述】:
我对结构元素的内存对齐有一个令人困惑的行为。考虑这两种结构:
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'd 整个 t_outer 结构与 p's:
- 红色区域为
member1 - 蓝色区域为
member2 - 绿色区域为
member3 - 黄色区域标记
dbl1在member3内的位置
约束
- 编译器为VS2012
-
other_struct的实际结构在这里应该无关紧要,它是一个 40 字节大小的 4 字节对齐结构 - 我确实不想要该行为的任何解决方法(重新排序、打包等),但要解释为什么会发生这种情况。
【问题讨论】:
-
什么是“other_struct”?
-
填充由编译器自行决定插入,那么你使用的是哪个编译器?
-
你能澄清填充在哪里吗?在 member2 之前或之后。
标签: c windows memory alignment padding