【发布时间】:2021-07-22 06:10:34
【问题描述】:
我正在开发一个网络应用程序,我将在其中接收 2 个字节,并且某些位具有特定意义。我正在尝试将该数据包实现为一个结构。目的是对对象地址进行二进制复制,并且可以访问数据包的字段。这是一个代表我的问题的简单示例。当我们尝试检查位域和结构的大小时,它们并没有像预期的那样出现。
#include <bitset>
#include<iostream>
struct a
{
std::bitset<8> b;
uint8_t c;
};
int main()
{
std::cout<<sizeof(a);
}
输出:8
预期输出:2
这是特定于 Bitset 实现的东西吗?
通常,每个元素只占用一位(在大多数系统上,它比最小的元素类型:char 少八倍)。 (参考-cplusplus.com/reference/bitset/bitset/)
在 Microsoft Visual Studio 2019 16.10.2 上编译
【问题讨论】:
-
我希望
std::bitset有一个更明智的实现...您可以使用另一个uint8_t,或者使用实际的位域,例如uint8_t foo:1, bar:1;. -
问题是由于某种原因
sizeof(std::bitset<8>) == 8,它与godbolt.org/z/Mhd1n7TYK类无关。也许是因为效率,在某些系统中使用底层 8 字节类型实现 8 位(甚至更少)操作可能会更快?好消息是sizeof(std::bitset<64>) == 8而不是 64。
标签: c++ bit-fields