C++ C+中位集的大小是多少+;
我想知道比特集实际上是如何分配内存的。我从某个博客上读到,它占用了大量内存。但是,当我运行以下代码时:C++ C+中位集的大小是多少+;,c++,memory-management,bitset,C++,Memory Management,Bitset,我想知道比特集实际上是如何分配内存的。我从某个博客上读到,它占用了大量内存。但是,当我运行以下代码时: 位集位=001; cout不能寻址单独的位,最低的可寻址单元是字节。因此,不能精确地分配位 另一件事是填充-你几乎总是得到更多的字节分配,你要求,这是为了优化的目的。寻址不在32b边界上的字节通常比较昂贵,在x64 CPU上寻址不在64b边界上的字节会导致异常。(说到英特尔平台。) 我得到的输出是4。背后的解释是什么 标准中没有关于如何实现位集的信息。它是实现定义的,请查看编译器的位集头 还
位集位=001;
cout不能寻址单独的位,最低的可寻址单元是字节。因此,不能精确地分配位
另一件事是填充-你几乎总是得到更多的字节分配,你要求,这是为了优化的目的。寻址不在32b边界上的字节通常比较昂贵,在x64 CPU上寻址不在64b边界上的字节会导致异常。(说到英特尔平台。)
我得到的输出是4。背后的解释是什么
标准中没有关于如何实现位集
的信息。它是实现定义的,请查看编译器的位集头
还有C++中的空间分配方法吗?
不,在C++中没有分配空间的方法。
< P>你的CPU不使用单个位,而是用字节和字来操作。在您的例子中,sizeof(bits)的结果是4,因为编译器决定将此数据结构与4字节对齐。通常在32位处理器上,编译器会将分配的内存大小设置为4字节的倍数,因此大于3/8的4的最近倍数是4字节。您可以将sizeof(bitset)
近似为:
如果内部表示为32位(如32位系统上的无符号),则表示为4*((N+31)/32)
如果内部表示为64位(如64位系统上的无符号长型),则表示为8*((N+63)/64)
似乎第一个是真的:<代码> 4 *((3 + 31)/32)< /> >是代码> 4 < /Cord>< /P>不能分配位空间,因为这不是C++抽象机的工作原理。就像你在超市买不到半个香蕉一样,你也不能分配半个字节。它至少会将存储N位所需的字节数取整到最小。编译器会添加对齐和填充来更快地访问数据,但它如何精确地定义了实现。“还有一种方法在C++中分配空间吗?”是的,但是每次只能分配8个……@ LuChanangGigor不总是8;这取决于
CHAR\u BIT
@LuchianGrigore s/pedantry/correction/你能解释一下为什么是(N+31)/32
?Thx.@Deqing这是一些整数中的数字/分母表达式计算上限值的方法。要获得ceil(N/D)-您需要使用以下表达式:(N+D-1)/D。请参见:31==32-1。我需要N/32的上限值,所以我用这个技巧得到它…公式4*((N+31)/32)
对我的N=3,40有效,但当N=66时失败。似乎这里没有确定的公式…@ifelsemonkey-你是说sizeof(std::bitset)
不是4*(66+31)/32
哪个是12?可能高于某个数字(如66)-“您的”位集在内部更改为uint64\u t[]
array-因此其大小为8*(66+63)/64
哪个是16?@ifelsemonkey-无论如何-我们无法100%预测位集的大小-因为它的内部表示可能会改变,因为新版本的std库选择了其他内部表示。所以我的答案是真实值的近似值(我用了这个动词)。
bitset<3> bits = 001;
cout<<sizeof(bits);