为什么带有位字段的结构体的大小不是我预期的。
#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 个字节?
最佳答案
不仅仅是位域,所有结构都由编译器对齐以获得最大效率。如果您想强制它们达到最小大小,您需要使用 gcc 的属性 packed
或您正在使用的编译器中的等效属性,如下所示:
#include <iostream>
using namespace std;
struct test {
uint8_t x : 4;
uint16_t y : 8;
uint16_t z : 8;
} __attribute__ ((packed));
struct test2 {
uint8_t x : 4;
uint16_t y : 10;
uint16_t z : 10;
} __attribute__ ((packed));
int main()
{
cout << sizeof(test) << endl;
cout << sizeof(test2) << endl;
}
关于c++ - C++ 中带位字段的结构体大小不相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69534781/