我想知道bitset实际上是如何分配内存的。我从一些博客中读到它以位(bit)的形式占用内存。但是当我运行以下代码时:
bitset<3> bits = 001;
cout<<sizeof(bits);
我得到的输出是4。这背后的解释是什么?另外,在C++中是否有一种方法可以分配位空间?
我想知道bitset实际上是如何分配内存的。我从一些博客中读到它以位(bit)的形式占用内存。但是当我运行以下代码时:
bitset<3> bits = 001;
cout<<sizeof(bits);
我得到的输出是4。这背后的解释是什么?你可以近似计算 bitset<N>
的大小为:
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
看起来第一种情况是正确的: 4 * ((3 + 31) / 32)
是 4
(N + 31) / 32
吗?谢谢。 - Deqing4 * ((N + 31) / 32)
对于 n = 3,40 可以使用,但是当 n = 66 时失败了。看来这里没有确定性的公式... - daparicsizeof(std::bitset<66>)
不是 4 * (66+31)/32
,这个结果是12吗?也许在某些数字(比如66)以上,“你的”bitset内部会改变为 uint64_t[]
数组 - 所以它的大小是 8 * (66+63)/64
,即16? - PiotrNycz您的CPU不是按位操作,而是按字节和单词操作。在您的情况下,sizeof(bits)的结果为4,因为编译器决定将此数据结构对齐到4个字节。
你不能单独寻址位,最小可寻址单位是字节。因此,不,你无法精确地分配位。
另一件事是填充 - 你几乎总是会获得比你要求的更多的字节分配,这是为了优化目的。在32位边界上不寻址字节通常很昂贵,在x64 CPU上不在64位边界上寻址字节会导致异常。(谈到英特尔平台。)
CHAR_BIT
。 - user1203803