【发布时间】:2021-10-12 03:31:45
【问题描述】:
为什么带有位字段的结构的大小不是我所期望的。
#include <iostream>
using namespace std;
struct test {
uint8_t x : 4;
uint16_t y : 8;
uint16_t z : 8;
};
struct test2 {
uint8_t x : 4;
uint16_t y : 10;
uint16_t z : 10;
};
int main()
{
cout << sizeof(test) << endl;
cout << sizeof(test2) << endl;
}
这会打印 4 和 4。
我不明白为什么这两个的大小都不是 3。Test 有 4+8+8 位,即 20,Test2 有 4+10+10 位,即 24 位,都小于或等于 24 位/3 字节。我知道如果在测试中我使用uint_8,它将导致大小为 3,但对于我的实际用例,我需要 Test2(4、10、10 位)。为什么会这样,有没有办法把它变成 3 个字节?
【问题讨论】:
-
熟悉结构填充,以及编译器调整填充的可用选项,例如
#pragma pack或类似结构。 -
查找“结构填充”。位域的细节略有不同,但原理是相同的。同样,大多数编译器都支持可以控制填充的选项(例如命令行选项或
#pragmas)。禁用(或显式控制)填充有许多影响(例如性能,CPU 可能会触发需要处理以使代码正确运行的硬件异常) - 节省空间并不总是如此(特别是对于现代编译器和平台)通过结构填充是有益的。 -
如果您使用
/Wall编译,某些编译器会在数据成员后添加填充时显示警告
标签: c++ bit-fields