c++ STL:为什么STL数据结构不提供测量内存消耗的函数?
C++ STL: Why do STL data structures not provide a function for measuring the memory consumption?
在决定任务的最佳数据结构时,有三个考虑因素:
- 功能:数据结构是否提供了我需要的操作
- 性能:这些操作有多快
- 内存消耗:数据结构使用了多少内存
第一个考虑因素可以通过检查数据结构的接口来发现,第二个考虑因素只能在基准测试中测量。然而,如果数据结构只提供计算当前使用的内存的方法,则第三种方法相当简单,否则很难。
STL数据结构没有这样的方法。但是为什么呢?对STL中的所有数据结构实现这样的方法是非常简单的。对于作为客户端的我来说,编写这样的方法是相当困难的,因为我必须熟悉内部实现。此外,实现隐藏在私有成员后面,因此我根本无法访问它们。
那么为什么他们被遗漏了呢?现在,在选择数据结构时,许多其他实现,比如当前发布的google btree实现都提供了这些方法。比较这些数据结构很容易。然而,当问及STL数据结构在内存消耗方面的表现时,我所能做的基本上就是猜测。
我找不到任何理由,为什么省略这些方法可能是一个设计决策。此外,c++是一种针对高性能和低内存占用进行了优化的语言。特别是在这样一种语言中,我认为评估数据结构的内存消耗是一个非常常见的用例。所以我也不认为它们被忽略了,因为没有人会使用它们。此外,STL也是一个相当成熟的库,所以原因也不应该是该库不够详细。那么省略这些方法的原因是什么呢?
全局,毫无疑问,因为容器无法知道有多少它使用的内存。它可以(并且确实)有一个返回它包含的元素数,在std::vector
这样的情况下,其中容器过度分配,它有一个函数(std::vector<>::capacity
)它告诉你它有多少元素分配。但它没有办法考虑任何额外的这种分配的开销(一定会有一些)。这样的开销将取决于分配器,通常在更低的级别上分配器使用的函数。在最低的水平上,它是不相等的清楚这意味着什么:如果我malloc
一个字节,malloc
可能在事实分配根据其"分配"的概念。但是,如果当我分配一个字节时,malloc
的池中没有空闲内存将转到系统,可能会分配1兆字节或更多。那么这种情况下的内存使用是:1字节、16字节还是1兆字节或更多?
但是为什么呢?
因为他们的任务是纯粹的抽象。std::vector
不是用来存储和对象的数组,告诉它们当前在实现中消耗了多少字节。
我发现这个问题与经常出现的"我如何才能找到一个malloc()
指针指向多少内存"的问题非常相似(可能相关),也许答案也是一样的:你需要跟踪你自己的东西。(这可能不方便,但那是另一个问题…)
- 具有 STL 向量类型成员的类的复制内存
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 具有 STL 类 c++ 的结构的内存分配
- 有没有办法从 STL 获取无开销的原始内存容器
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- c ++ stl 库容器具有动态内存分配
- C++ 使用数组初始化时的 STL 向量内存管理
- 内存泄漏的 STL 替代方案
- 为什么 XOCDE STL 源内存类型定义有 |象征
- 如何根据STL列表中的元素数量分配内存
- 没有碎片stl容器的大容量内存
- 没有stl和动态内存分配的成员函数类
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 带有内存比较的 STL 映射.如何在运行时设置比较块大小
- STL 矢量 push_back() 内存双倍可用
- 在插入C STL地图之前,我需要使用新的内存分配内存
- C++STL内存管理:堆栈或堆
- C++容器中的 STL 内存管理
- 如何强制清除 STL 内存缓存