c++ - C++ 中带位字段的结构体大小不相加

标签 c++ bit-fields

为什么带有位字段的结构体的大小不是我预期的。

#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/

相关文章:

c++ - std::merge 不适用于 std::async

c++ - Qt 5,获取鼠标在屏幕中的位置

c++ - 您可以在同一个 union 中同时使用固定大小的类型和指针吗?

c++ - 位域大小不符合预期,为什么?

c - 如何使用 char 数组将位字段打包为短整数?

c++ - 底层 STL:在没有新 vector 的情况下将 std::vector 连接到自身

C++ 命名空间 - 嵌套命名空间的前向声明和可见性

java - 在表示位域的字节数组中操作位的有效方法

c - 位域 : Set vs test-and-set (for performance)

c - 带有位域和 char * 的 fwrite/fread 结构