为什么结构和工会之间的规模不匹配

Why is there a size mismatch between structures and unions?

本文关键字:不匹配 之间 结构 为什么      更新时间:2023-10-16

我已经声明了一个为变量"sample_union"分配4100字节的并集,并作为分配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 ;

将上述并集放置在结构内部是分配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

当您将并集放置在结构中时,您没有将并集标记为packed。未封装的并集有一点填充(四个字节),因此其大小是uint64_t大小的倍数。

拥挤的工会没有这种填充物,所以它更小。

顺便说一句,联合内部的匿名结构没有标记为packed。在这种情况下,这并不重要,因为无论如何,一切都很好地对齐了——但这是需要注意的。