我想知道bitset实际上是如何分配内存的。我从一些博客中读到它以位为单位占用内存。但是,当我运行以下代码时:
bitset<3> bits = 001;
cout<<sizeof(bits);
我得到的输出为 4。它背后的解释是什么?
还有在 C++ 中以位为单位分配空间的方法吗?
您可以将
sizeof(bitset<N>)
近似为:
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
看来第一个是真的:
4 * ((3 + 31) / 32)
是4
我得到的输出为 4。它背后的解释是什么?
标准中没有关于如何实现
bitset
的信息。它是实现定义的,请查看编译器的 <bitset>
标头。
还有在C++中以位为单位分配空间的方法吗?
不,C++ 中没有以位为单位分配空间的方法。
您的 CPU 不是使用单个位进行操作,而是使用字节和字进行操作。在您的情况下,sizeof(bits) 结果为 4,因为编译器决定将此数据结构与 4 字节对齐。
通常在 32 位处理器上,编译器会将分配的内存大小设置为 4 字节的倍数,因此大于 3/8 的最接近的 4 倍数是 4 字节。
您无法对单独的位进行寻址,最低可寻址单位是字节。所以不,你不能精确地分配位。
另一件事是填充 - 您几乎总是会获得您要求的更多字节分配,这是为了优化目的。寻址不在 32b 边界上的字节通常很昂贵,在 x64 CPU 上寻址不在 64b 边界上的字节会导致异常。 (说到英特尔平台。)