为什么结构和工会之间存在尺寸不匹配?

时间:2016-04-14 10:46:03

标签: c++ c linux gcc

我已经声明了一个联合分配4100个字节到变量" sample_union"并将相同的union声明作为分配4104字节的结构的一部分。

union test_size_union {
    struct {
        uint8_t type;
        union {
            uint8_t count;
            uint8_t list;
        };
        uint16_t rc;
        uint16_t arr_value[2048];
    };
    uint64_t first_dword;
}__attribute__((packed)) sample_union ;

将上面的union放在结构内部分配4104个字节。

struct test_size_struct {
    union {
        struct {
            uint8_t type;
            union {
                uint8_t count;
                uint8_t list;
            };
            uint16_t rc;
            uint16_t arr_value[2048];
        };
        uint64_t first_dword;
    };
}__attribute__((packed)) sample_struct;

嗯,这不是项目要求,但我想知道为什么编译器对这两个声明的行为不同。

gcc版本:(GCC)4.9.2,x86_64

平台:Linux,x86_64

1 个答案:

答案 0 :(得分:11)

当您将联合放置在结构中时,您没有将联合标记为packed。解压缩的联合有一个小填充(四个字节),因此它的大小是uint64_t大小的倍数。

打包的联合没有这个填充,所以它更小。

作为侧面观察,联合中的匿名结构未标记为packed。在这种情况下,这种情况并不重要,因为无论如何一切都很好地对齐 - 但它需要注意的事情。