【问题标题】:What is the size of bitset in C++C ++中bitset的大小是多少
【发布时间】:2012-09-09 16:29:39
【问题描述】:

我想知道 bitset 是如何实际分配内存的。我从一些博客中读到它会占用内存。但是,当我运行以下代码时:

   bitset<3> bits = 001;
   cout<<sizeof(bits);

我得到的输出为 4。它背后的解释是什么?

还有一种方法可以在 C++ 中以位为单位分配空间吗?

【问题讨论】:

  • 您不能以位为单位分配空间,因为这不是 C++ 抽象机的工作方式。就像你在超市买不到半根香蕉一样,你也不能分配半个字节。
  • 它将四舍五入到存储 N 位所需的最少字节数,至少。编译器将添加对齐和其他内容以加快访问数据的速度,但具体如何实现则由实现定义。
  • “在C++中也有分配位空间的方法吗?”,是的,但你一次只能分配8个......
  • @LuchianGrigore 并不总是 8;这取决于CHAR_BIT
  • @LuchianGrigore s/pedantry/correctness/

标签: c++ memory-management bitset


【解决方案1】:

您可以将sizeof(bitset&lt;N&gt;) 近似为:

  1. 如果内部表示为 32 位(如 32 位系统上的无符号),则为 4 * ((N + 31) / 32)
  2. 如果内部表示是 64 位(如 64 位系统上的无符号长整数)为 8 * ((N + 63) / 64)

好像第一个是真的:4 * ((3 + 31) / 32)4

【讨论】:

  • 你能详细说明为什么是(N + 31) / 32吗?谢谢。
  • @Deqing 这就是如何为整数中的某些 Numberator/Denominator 表达式评估上限值的方式。要获得 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&lt;66&gt;) 不是 4 * (66+31)/32 是 12 吗?也许高于某个数字(如 66) - “你的”位集内部更改为 uint64_t[] 数组 - 所以它的大小是 8 * (66+63)/64 即 16?
  • @ifelsemonkey - 无论如何 - 我们不能 100% 预测 bitset 的大小 - 因为它的内部表示可能会因为新版本的 std 库选择其他内部表示而改变。所以我的答案只是实际价值的近似值(我用了这个动词)。
【解决方案2】:

我得到的输出是 4。它背后的解释是什么?

标准中没有关于如何实现bitset 的信息。它的实现已定义,请查看您的编译器的bitset header

在 C++ 中还有没有按位分配空间的方法?

不,在 C++ 中没有按位分配空间的方法。

【讨论】:

    【解决方案3】:

    您的 CPU 不使用单个位,而是使用字节和字。在您的情况下, sizeof(bits) 结果为 4,因为编译器决定将此数据结构对齐到 4 个字节。

    【讨论】:

      【解决方案4】:

      通常在 32 位处理器上,编译器会将分配的内存大小设为 4 字节的倍数,因此大于 3/8 的最接近的 4 倍数是 4 字节。

      【讨论】:

        【解决方案5】:

        您不能寻址单独的位,最低可寻址单位是字节。所以不,你不能精确地分配位。

        另一件事是填充 - 您几乎总是会分配更多您要求的字节,这是为了优化目的。寻址不在 32b 边界上的字节通常很昂贵,在 x64 CPU 上寻址不在 64b 边界上的字节会导致异常。 (说到英特尔平台。)

        【讨论】:

          猜你喜欢
          • 2016-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多