在决定任务的最佳数据结构时,有三种考虑因素:
通过检查数据结构的接口可以找到第一个考虑因素,第二个只能在基准测量中测量。但是,如果数据结构只是提供了一种计算当前使用的内存的方法,那么第三种方法就很简单了。
STL数据结构没有这种方法。但为什么?对STL中的所有数据结构实现这样的方法将非常简单。对于我作为客户端,编写这样的方法非常困难,因为我必须熟悉内部实现。此外,这些实现隐藏在私有成员之后,因此我根本无法访问它们。
那他们为什么被排除在外呢?现在,在选择数据结构时,许多其他实现(如当前发布的谷歌btree实现)确实提供了这些方法。比较这些数据结构很容易。但是,当询问STL数据结构在内存消耗方面的表现时,我基本上可以做的就是猜测。
我找不到任何理由,为什么省略这些方法可能是一个设计决定。此外,C ++是一种针对高性能和低内存占用而调整的语言。特别是在这种语言中,我认为评估数据结构的内存消耗是一个很常见的用例。所以我也不能认为他们被排除在外因为没有人会使用它们。另外,STL也是一个非常成熟的库,所以原因也不应该是库不够详细。那么省略这些方法的原因可能是什么呢?
答案 0 :(得分:5)
全球,毫无疑问因为容器无法知道多少
它使用的记忆。它可以(并且确实)具有返回的函数
它包含的元素数量,以及像std::vector
这样的情况
容器 overallocates ,它有一个功能
(std::vector<>::capacity
)告诉你它有多少元素
分配。但它没有办法考虑任何额外的
这种分配的开销(并且肯定会有一些)。这样
开销将取决于分配器,通常甚至更低
分配器使用的函数。在最低级别,它甚至不是
清楚这意味着什么:如果我malloc
一个字节,malloc
可能在
事实上根据其“分配”的概念分配16。但如果
当我分配一个字节时,malloc
在其池中没有空闲内存
将进入系统,可能分配一兆字节或更多。所以呢
在这种情况下是内存使用:1字节,16字节,还是兆字节或更多?
答案 1 :(得分:1)
但为什么?
因为他们的任务是纯粹的抽象。 std::vector
不用于存储对象数组和,以告知它们当前在实现中消耗了多少字节。它意味着存储一组对象
我发现这个问题与不断重复出现的问题非常相似(并且可能是相关的)“如何找出malloc()
指针指向”问题的内存量,也许答案也是一样的:你需要跟踪自己的东西。 (这可能不方便,但这是另一个问题......)