为什么结构和工会之间的规模不匹配
Why is there a size mismatch between structures and unions?
我已经声明了一个为变量"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
。在这种情况下,这并不重要,因为无论如何,一切都很好地对齐了——但这是需要注意的。
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- 不同c++编译器之间的自动类型推导不匹配
- 如何更有效地计算n个字符串之间的不匹配分数?
- 警告MSB3270:项目的处理器体系结构之间的不匹配
- C++符号和Q符号之间不匹配
- openssl和linux bash计算之间的MD5不匹配
- 为什么结构和工会之间的规模不匹配
- OpenCL:指令和地址之间的状态空间不匹配
- 希望有效地克服 Boost.Process 间共享内存中映射中键类型之间的不匹配
- 抵消内存中加载的 DLL 与硬盘上的 DLL 之间的不匹配
- 编译器(Visual Studio 2010和GCC)之间的浮点不匹配
- ECDH共享密钥在Crypto++和Android之间不匹配
- 为什么我的静态方法的返回值与定义的构造函数(在 c++ 中)之间存在类型不匹配?
- 如何最好地防止库(源)和应用程序(头)编译之间的(编译器)标志不匹配
- 如果字符位于引号之间,则不匹配(AKA具有编程字符串模式)