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);