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