为什么工会&内部结构添加填充?

时间:2017-09-01 13:09:34

标签: c padding unions

在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;

2 个答案:

答案 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;

它不漂亮,但它可以达到我想要的效果,而无需打包任何东西。