16

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

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

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

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

4

5 回答 5

13

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

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

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

于 2012-09-17T13:14:02.310 回答
8

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

标准中没有关于bitset应该如何实现的信息。它是实现定义的,看看bitset header你的编译器。

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

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

于 2012-09-17T12:53:43.800 回答
8

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

于 2012-09-17T12:53:54.800 回答
1

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

于 2012-09-17T12:54:56.357 回答
0

您不能寻址单独的位,最低可寻址单位是字节。所以不,你不能精确地分配位。

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

于 2012-09-17T12:53:19.003 回答