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

gex*_*ide 2 c++ stl

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

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

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

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

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

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

Jam*_*nze 5

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