我有一个混乱的行为与内存对齐的结构元素。考虑这两种结构:
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结构:
member1member2member3dbl1在member3中的位置。

约束
other_struct的实际结构不重要,它是一个40字节大小的4字节对齐结构发布于 2015-01-08 14:58:40
使dbl1在8字节的边框上对齐。
好的。但是,这种对齐保证意味着如果结构本身也不对齐8,就意味着bupkis。这是一个通常由编译器为数据部分和堆栈帧的地址选择提供的保证。或者内存分配器。所有保证至少对齐到8。
但是,当您在s_outer中嵌入结构时,需要在member3 (而不是在member2之后)之前的4字节填充来获得对齐保证。
还请注意,结构可以在最后一个成员之后填充。以确保当结构存储在数组中时,成员仍然对齐。同样的理由。
发布于 2015-01-08 14:45:27
VS2012 docs 描述它的填充行为.特别是,它们指定struct的对齐需求是其任何成员中最大的对齐需求。成员member3的类型t_inner有一个double类型的成员,有一个8字节对齐的要求,因此member3总体上有一个8字节对齐的要求(并且t_outer有一个8字节对齐的要求)。member2和member3之间需要填充以获得member3的8字节对齐。
https://stackoverflow.com/questions/27841898
复制相似问题