2

在决定任务的最佳数据结构时,需要考虑三个方面:

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

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

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

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

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

4

2 回答 2

5

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

于 2013-03-03T22:07:05.757 回答
1

但为什么?

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

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

于 2013-03-03T21:54:11.110 回答