【问题标题】:Memory allocation of C++ vector<bool>C++向量的内存分配<bool>
【发布时间】:2015-10-09 23:11:50
【问题描述】:

C++ STL 中的vector&lt;bool&gt; 类针对内存进行了优化,以便为每个存储的bool 分配一位,而不是一个字节。每次我为vector&lt;bool&gt; x 输出sizeof(x) 时,结果是创建向量结构的40 个字节。 sizeof(x.at(0)) 总是返回 16 个字节,这必须是为许多 bool 值分配的内存,而不仅仅是位置为零的值。 16 个字节涵盖了多少个元素?到底是128?如果我的向量有更多或更少的元素怎么办?

我想测量向量及其所有内容的大小。我将如何准确地做到这一点?是否有可用于查看每个变量分配的内存的 C++ 库?

【问题讨论】:

  • 您将对象的大小对象分配的内存混淆了。
  • 我明白其中的区别,我只是不知道用什么来查找分配的内存
  • 这是一个很难定义的概念,因为一个字节的内存可能没有明确定义的所有权。它可以“属于”多个变量,也可以在其“拥有变量”被销毁后保持分配

标签: c++ memory memory-management vector stl


【解决方案1】:

我认为没有任何标准方法可以做到这一点。 vector&lt;bool&gt; 实现为您提供的有关其工作原理的唯一信息是 reference 成员类型,但没有理由认为这与数据在内部的实际存储方式有任何一致性。只是当您将迭代器取消引用到容器中时,您会得到一个 reference

所以你已经知道了容器本身的大小,这很好,但是要获得数据占用的内存量,你将不得不检查你的实现的标准库源代码并得出一个解决方案从此。不过,老实说,这似乎是一件奇怪的事情。

实际上,首先使用vector&lt;bool&gt; 是一件很奇怪的事情。以上所有本质上就是为什么现在它的使用不受欢迎的原因:它几乎完全不兼容其他标准容器设置的约定……甚至是其他 vector 专业化设置的约定。

【讨论】:

  • 还有 capacity vs sizestd::vector 的完整概念,因为出于性能原因,它可能分配的内存超出了它的需要(在确切的时刻)。
  • sizeof(x) + sizeof(decltype(x)::value_type)*x.capacity() 是我想要的。这有帮助。
  • @CoryKramer: 是的,尽管我能模糊地提出这个问题的唯一用例是分析容器使用了多少内存,不管它目前是否全部用于实际存储一些东西。
  • @apoorvk:但它非常错了。 decltype(x)::value_type 在这里是 bool,根据定义,这不是您在实践中要存储的内容(否则这有什么意义?)
  • @apoorvk:它给出的结果不准确,因为它假装每个布尔值占用 1 个字节。而且您甚至不知道每个布尔值将精确地占用 1 位。一般来说,你根本什么都不知道。正如我所说,您将不得不检查您的具体实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多