【问题标题】:Why is there a size mismatch between structures and unions?为什么结构和联合之间存在大小不匹配?
【发布时间】:2016-04-14 10:46:03
【问题描述】:

我已经声明了一个联合,将 4100 字节分配给变量“sample_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

【问题讨论】:

  • 请注意,C++ 标准不允许匿名结构(GCC 确实将其作为扩展提供)。
  • @JoachimPileborg:数组的类型为uint16_t[2048],因此在大多数机器上占用4096字节。
  • @user50 不要在 cmets 中发布多行代码; edit 你的问题。
  • 改写我原来的评论:inside union 的结构没有打包。
  • 实际上,在这种情况下打包一个联合是有意义的。未打包的联合有一些填充,因此它的大小是 8 的倍数 (sizeof(uint64_t))。打包的联合没有。

标签: c++ c linux gcc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 2021-05-28
    • 2021-04-26
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多