具有长长位字段的 C++ 结构

c++ struct with long long bit field

本文关键字:C++ 结构 字段      更新时间:2023-10-16

我对包括位字段在内的结构有一些问题。请考虑以下代码:

#pragma pack(push, 1)
struct DATA_WARNINGS {
    unsigned char fl_num        : 8;
    unsigned char dev_reload    : 1;
    unsigned char               : 1;
    unsigned long long flags    : 54;
};
#pragma pack(pop)

这种结构的大小为预期的 10 个字节。我想做的是在不改变位字段宽度的情况下,以 8 个字节来适应这种结构。所以我所做的是将第一个字段的类型更改为无符号长长。喜欢这个:

#pragma pack(push, 1)
struct DATA_WARNINGS {
    unsigned long long fl_num   : 8;
    unsigned char dev_reload    : 1;
    unsigned char               : 1;
    unsigned long long flags    : 54;
};
#pragma pack(pop)

我希望所有结构都适合一个无符号的长长。但实际上这种结构的大小变成了 sizeof 返回的 17 个字节。如果我将所有字段类型更改为无符号长,则结构大小变为 8 字节。问题是如何在不更改字段类型的情况下适应 8 个字节的结构。我在 2013 位机器上使用 VS32。

通常,在处理位字段时,大小/布局完全取决于编译器。

结构大小奇数的原因实际上是因为底层类型(unsigned long long vs unsigned char)不同,因此编译器不会尝试合并位字段。当它们都unsigned long long时,编译器可以将它们合并成一个8字节的数量。因此,除了将所有内容更改为unsigned long long之外,实际上没有解决方法。