问题
在访问结构成员(在 ARMv7 上)时,我偶然发现了对齐问题。被访问的成员本身也是一个结构,但包含了臭名昭著的#pragma pack(1)
预处理器指令。外部结构没有打包,所以像我这样天真的开发人员会怀疑成员的地址是根据外部结构的对齐设置对齐的。但显然情况并非如此:检查该成员对齐的静态断言失败。删除#pragma pack
(或通过 GCC 属性对齐成员时)对齐是可疑的。
问题)
为什么内部结构的打包会影响外部结构成员的对齐方式?对齐此成员的首选方法是什么?
示例代码
注意:在这个例子中,pragma pack
指令的用法非常明显。在现实世界中,结构是在外部库的标头中声明的,这有点看不到。
#include "stdint.h"
#include "stddef.h"
#include "stdbool.h"
#pragma pack(1)
struct a
{
uint32_t one;
uint32_t two;
};
#pragma pack()
struct b
{
uint32_t foo;
bool bar;
struct a foobar;// __attribute__((aligned(sizeof(void *))));
};
_Static_assert((offsetof(struct b, foobar) % 4 == 0),
"alignment issue");