【问题标题】:Memory consumption of a boost ptr_map of class A as key and vectors of pointers as value BA类的boost ptr_map作为键和指针向量作为值B的内存消耗
【发布时间】:2012-03-22 21:20:08
【问题描述】:

作为昨天发布的Memory consumption of a pointer to vector of pointers 的后续问题,我还有另一个问题是关于 boost ptr_map 的内存使用情况,键类型为 A 类(现在假设为 int),值为 (指向)某种类型的指针向量(再次假设为 int),这是一个 ptr_map。我读过How can i estimate memory usage of std::map?这个问题,STL映射的内存消耗一般是

(sizeof(A) + sizeof(B) + ELEMENT_OVERHEAD) * N + CONTAINER_OVERHEAD

我的问题是这样的设计元素开销有多大,相对于

sizeof(A) + sizeof(B)

假设类型 A 和 B(这里假设 A 是 int,而 B 是指向 int 指针向量的指针),我想即使是通常的 STL 映射的答案也会有所帮助。另外,我想知道如果可能的话,如果 A 更复杂,事情会如何/是否发生变化。我猜元素开销也会随着 A 的复杂性而增长?元素开销是否受限于 A 和 B 大小之和的一部分?我担心的是,如果元素开销是没有真正界限的很大一部分,那么使用地图的全部意义似乎就不再吸引人了。

【问题讨论】:

  • 这些开销通常是恒定的,并且与键和值无关。
  • 谢谢.. 但是与 sizeof(int) 相比,您知道元素开销有多大(我不关心容器开销)吗?这乘以 N,所以如果 N 很大,它就很重要。
  • 与任何相当大的向量使用的内存相比都很小。

标签: c++ boost stl map


【解决方案1】:

正如 Martinho Fernandes 在评论中所说,每个地图项的开销是恒定的。

调查一些标准库实现后地图项的开销:

  • GCC 4.4.3:每个节点有 3 个指针和一个枚举类型成员
  • MSVC++2008、MSVC++2010:每个节点有 3 个指针和 2 个字符成员
  • STLPort 5.2.1:每个节点有 3 个指针和 1 个 bool 成员

GCC 4.4.3、MSVC++2008、MSVC++2010和STLPort 5.2.1使用红黑树实现map。

【讨论】:

  • 哇.. 所以只是一个整数映射作为键,根据你所说的,假设一个大小为 5000 万的映射。由于指针的大小是固定的并且假设内容指向已经在全局范围内的事物,因此消耗的内存至少是(8 + 8 + 4*8 + 枚举大小)* 5000 万字节?我震惊了。
  • @squashed.bugaboo 你认为你的 5000 万个向量占用了多少空间?
  • 好吧,我的向量是一个指针向量,每个指针都指向全局范围内的数据..(因此本身没有额外的内存),而且通常这些向量的大小都是 6(所以 6指向已经在内存中的数据的指针)..所以由于映射的值是指向这样一个向量的指针..我有 8(int 键)+ 8(指向 vec 的指针)+ 4*8(基于 vnm 的注释)+ 大小枚举/等..上帝,这令人沮丧!希望开销是 8+8 的一小部分。
  • @vnm:你什么意思??我刚刚向您展示了与每个项目相关的开销大于项目本身(假设是标准 64 位系统)。
  • @squashed.bugaboo "你确定这个信息吗?" std::map 的底层数据结构通常是红黑二叉树,因此我们需要每个节点的两个子节点指针。 MSVC 和 GCC 都将指向父节点的指针添加到节点。红色或黑色指示的加号标志。所以我们每个节点都有 3 个 ptr 和一个枚举类型成员。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2010-11-30
  • 2015-02-15
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多