具有长长字段的c ++结构

时间:2014-01-08 10:30:22

标签: c++ struct bit-fields

我在结构中遇到了一些问题,包括位字段。请考虑以下代码:

#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个字节中。所以我所做的是将第一个字段的类型更改为unsigned long long。像这样:

#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个字节。如果我将所有字段类型更改为unsigned long long,则结构大小将变为8个字节。 问题是如何在不改变字段类型的情况下将结构拟合为8个字节。我在32位机器上使用VS2013。

1 个答案:

答案 0 :(得分:2)

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

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