C ++中bitset的大小是多少

时间:2012-09-17 12:50:38

标签: c++ memory-management bitset

我想知道bitset实际上是如何分配内存的。我从一些博客中读到,它占用了内存。但是当我运行以下代码时:

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

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

还有一种在C ++中以位为单位分配空间的方法吗?

5 个答案:

答案 0 :(得分:9)

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

  1. 如果内部表示为32位(如32位系统上的无符号),则为4 * ((N + 31) / 32)
  2. 如果内部表示为64位(如64位系统上的无符号长整数),则为8 * ((N + 63) / 64)
  3. 似乎第一个是真的:4 * ((3 + 31) / 32)4

答案 1 :(得分:8)

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

答案 2 :(得分:7)

  

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

标准中没有关于如何实现bitset的信息。它的实现已定义,请查看编译器的bitset header

  

还有一种在C ++中以位为单位分配空间的方法吗?

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您无法处理单独的位,最低的可按位单位是字节。所以不,你不能精确地分配位。

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