c++ - 为什么结构和 union 之间存在大小不匹配?

标签 c++ c linux gcc

我已经声明了一个 union ,将 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

最佳答案

当您将 union 置于结构中时,您并未将 union 标记为已打包。解压缩的 union 有一点填充(四个字节),因此它的大小是 uint64_t 大小的倍数。

packed union 没有这个填充,所以它更小。

作为侧面观察, union 内的匿名结构未标记为packed。在这种情况下,这恰好无关紧要,因为无论如何一切都很好地对齐 - 但这是需要注意的事情。

关于c++ - 为什么结构和 union 之间存在大小不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36620780/

相关文章:

c++ - 摆脱 FFmpeg 不存在的 PPS 错误

linux - 使用 bash 和 HMAC 创建 TOTP

linux - 如何在 linux ubuntu 中启动 gui 应用程序

c - 调用函数填充后的空结构

c - 从服务器向客户端发送 float

c - 调用 execv() 时动态分配的内存会发生什么?

c++ - 用列号 boost spirit 动态词法分析器?

c++ - OpenGL 纹理未显示(纯色而不是纹理)或显示有伪影

c++ - 如何选择 SQLite 日期格式

c - 预处理器常量折叠