我想知道位集实际上是如何分配内存的。 我从某个博客中得知,它占用了内存一点点。 但是,当我运行以下代码时:

   bitset<3> bits = 001;
   cout<<sizeof(bits);

我得到的输出为4。其背后的解释是什么?

还有没有一种方法可以在C ++中按位分配空间?

#1楼 票数:9 已采纳

您可以将sizeof(bitset<N>)近似为:

  1. 如果内部表示形式是32位(例如在32位系统上为无符号),则为4 * ((N + 31) / 32)
  2. 如果内部表示形式是64位(如64位系统上的unsigned long),则表示为8 * ((N + 63) / 64)

似乎第一个是对的: 4 * ((3 + 31) / 32)4

#2楼 票数:8

您的CPU不是用单个位来操作,而是用字节和字来操作。 在您的情况下,sizeof(bits)的结果为4,因为编译器决定将此数据结构对齐为4个字节。

#3楼 票数:7

我得到的输出为4。其背后的解释是什么?

有一个在标准中没有有关如何bitset应该可以实现。 它是实现定义的,请查看编译器的bitset header

还有没有一种方法可以在C ++中按位分配空间?

不,在C ++中没有方法可以按位分配空间。

#4楼 票数:1

通常,在32位处理器上,编译器将使分配的内存大小为4字节的倍数,因此,大于3/8的最接近4的倍数为4字节。

#5楼 票数:0

您不能寻址单独的位,最低可寻址单位是字节。 因此,不能,您不能精确分配位。

另一件事是填充-您几乎总是获得所需的更多字节分配,这是出于优化目的。 寻址不在32b边界上的字节通常很昂贵,在x64 CPU上寻址不在64b边界上的字节会导致异常。 (谈到英特尔平台。)

  ask by Saurabh translate from so

未解决问题?本站智能推荐:

1回复

C ++-std :: bitset <0>的大小?

我认为std::bitset<0> myBS的大小为0 ,而std::cout << sizeof(myBS)打印出1 。 谁能解释一下吗? 这是否意味着一个位集永远不能为空?
2回复

增长、缩小和克隆其值后的 Java BitSet 大小是多少?

让bs1成为 Java 中的 BitSet。 第一位设置为bs1.set(0) ,然后其size和length分别为 64 和 1。 第 65 位设置为bs1.set(64) ,则其size和length分别为 128 和 65。 现在,如果我清除它的第 65 位bs1.clear(64) ,它的
2回复

用C ++初始化位集

我需要为IPV4实现一个Address类。 当我调用Address类的构造函数时,我正在->将输入解析为4的8位数组,这基本上是IPV4的4个八位位组。 255.255.255.255例如。 现在,我需要将其转换为4的二进制数组。我不想为此创建外部二进制转换器。 我愿意使用bit
1回复

具有if语句的C ++位集

我想知道是否无论如何都可以在if语句中使用特定范围的位。 即时通讯使用fpga通过USB向PC发送8位二进制数据。 每笔交易有3x 8位数据包。 在每个数据包中,前四位由外部模块生成,我想在后四位中发送控制数据。 => USB接口接受数据作为整数,我有位功能将整数转换为8位二进制。
2回复

C ++位集没有内联?

我尝试以下方法: 使用GCC 4.8.1,我无法将其内联,objdump给了我更多或更少: -O1,-O2,-O3也不起作用,它完全优化了代码。 无论如何,我可以避免调用函数吗?
3回复

将1加到C ++位集

我有给定长度的C ++位集。 我想生成此位集的所有可能组合,为此我想到了增加1 2 ^ bitset.length次。 这个怎么做? Boost库解决方案也是可以接受的
1回复

从long转换的C ++ bitset构造函数的复杂性是什么?

我的猜测是O(n),其中n是no。 比特。 或者它是不变的? 我的意思是它不应该只能从内存中复制这些位吗?
2回复

位集和数字序列C ++

我在Stanley Lippman的书中随时学习C ++。 我正在学习名为“类位集”的段落。 在一个练习中,他给了我数值序列以转换为bitset <32>。 数值顺序为:1、2、3、5、8、13、21。 我能问一下我的代码正确吗? Lippman还希望我使用位集中的每个