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

C++ STL: Why do STL data structures not provide a function for measuring the memory consumption?

本文关键字:STL 内存 函数 测量 为什么 数据结构 c++      更新时间:2023-10-16

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

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

第一个考虑因素可以通过检查数据结构的接口来发现,第二个考虑因素只能在基准测试中测量。然而,如果数据结构只提供计算当前使用的内存的方法,则第三种方法相当简单,否则很难。

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

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

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

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

但是为什么呢?

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

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