C ++ STL:为什么STL数据结构不能提供测量内存消耗的功能?

时间:2013-03-03 21:42:00

标签: c++ stl

在决定任务的最佳数据结构时,有三种考虑因素:

  • 功能:数据结构是否提供了我需要的操作
  • 效果:这些操作的速度有多快
  • 内存消耗:数据结构使用多少内存

通过检查数据结构的接口可以找到第一个考虑因素,第二个只能在基准测量中测量。但是,如果数据结构只是提供了一种计算当前使用的内存的方法,那么第三种方法就很简单了。

STL数据结构没有这种方法。但为什么?对STL中的所有数据结构实现这样的方法将非常简单。对于我作为客户端,编写这样的方法非常困难,因为我必须熟悉内部实现。此外,这些实现隐藏在私有成员之后,因此我根本无法访问它们。

那他们为什么被排除在外呢?现在,在选择数据结构时,许多其他实现(如当前发布的谷歌btree实现)确实提供了这些方法。比较这些数据结构很容易。但是,当询问STL数据结构在内存消耗方面的表现时,我基本上可以做的就是猜测。

我找不到任何理由,为什么省略这些方法可能是一个设计决定。此外,C ++是一种针对高性能和低内存占用而调整的语言。特别是在这种语言中,我认为评估数据结构的内存消耗是一个很常见的用例。所以我也不能认为他们被排除在外因为没有人会使用它们。另外,STL也是一个非常成熟的库,所以原因也不应该是库不够详细。那么省略这些方法的原因可能是什么呢?

2 个答案:

答案 0 :(得分:5)

全球,毫无疑问因为容器无法知道多少 它使用的记忆。它可以(并且确实)具有返回的函数 它包含的元素数量,以及像std::vector这样的情况 容器 overallocates ,它有一个功能 (std::vector<>::capacity)告诉你它有多少元素 分配。但它没有办法考虑任何额外的 这种分配的开销(并且肯定会有一些)。这样 开销将取决于分配器,通常甚至更低 分配器使用的函数。在最低级别,它甚至不是 清楚这意味着什么:如果我malloc一个字节,malloc可能在 事实上根据其“分配”的概念分配16。但如果 当我分配一个字节时,malloc在其池中没有空闲内存 将进入系统,可能分配一兆字节或更多。所以呢 在这种情况下是内存使用:1字节,16字节,还是兆字节或更多?

答案 1 :(得分:1)

  

但为什么?

因为他们的任务是纯粹的抽象。 std::vector不用于存储对象数组,以告知它们当前在实现中消耗了多少字节。它意味着存储一组对象

我发现这个问题与不断重复出现的问题非常相似(并且可能是相关的)“如何找出malloc()指针指向”问题的内存量,也许答案也是一样的:你需要跟踪自己的东西。 (这可能不方便,但这是另一个问题......)