C++中bitset的大小是多少

问题描述 投票:0回答:5

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

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

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

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

c++ memory-management bitset
5个回答
16
投票

您可以将

sizeof(bitset<N>)
近似为:

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

看来第一个是真的:

4 * ((3 + 31) / 32)
4


9
投票

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

标准中没有关于如何实现

bitset
的信息。它是实现定义的,请查看编译器的
<bitset>
标头。

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

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


8
投票

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


1
投票

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.