在amd64上,以下结构的大小为16个字节:
typedef struct _my_struct {
void *a;
UINT32 b;
UINT16 c;
UINT8 d;
UINT8 e;
} my_struct;
但是当我把前三个变量放在一个联合中时,大小变为24.为什么?
typedef struct _my_struct {
union {
struct {
void *a;
UINT32 b;
UINT16 c;
} my_inner;
struct {
void **f;
} my_inner2;
}
UINT8 d;
UINT8 e;
} my_struct;
答案 0 :(得分:7)
您正在创建新的结构类型(my_inner
)。编译器为此结构添加填充,使其大小为16字节(对于amd64)。然后它将填充添加到外部结构类型(my_struct
),这使其大小增加到24个字节。
答案 1 :(得分:1)
仅供参考,不增加整体规模的最简单方法是执行以下操作:
typedef struct _my_struct {
union {
struct {
void *a;
UINT32 b;
UINT16 c;
} my_inner;
struct {
void **f;
} my_inner2;
struct {
UCHAR __PADDING[sizeof(void*) + sizeof(UINT32) + sizeof(UINT16)];
UINT8 d;
UINT8 e;
};
}
} my_struct;
它不漂亮,但它可以达到我想要的效果,而无需打包任何东西。