【发布时间】: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))。打包的联合没有。