通过STL容器内存消耗(Memory consumption by STL containers)

2019-06-26 20:20发布

我的工作中,我打算用几个STL容器的应用。 如果内存消耗达到阈值,应用程序将采取某些步骤。 为了这个目的,我需要执行一个接近准确的计算有多少内存被使用STL容器。

vector<string> StringList
map<string, int> mapstring

这就是我如何估算内存:

对于大小StringList ,遍历所有的矢量中的所有元素,并保持将所述串的尺寸。

string size = sizeof(string) + string.capacity()*sizeof(char)

后来终于添加到此sizeof(StringList);

对于mapstring的规模,环比容器的所有键和不断增加的字符串的大小,然后添加为int的大小是mapstring.size()*sizeof(int) 。 后来终于添加到此sizeof(mapstring);

我想一个更好的办法是指定自己的分配器类,并跟踪其内部的内存使用情况,但是写一个可能是不平凡的。 这是否估计好看吗?

Answer 1:

对于std::vectorstd::string ,能力,而不是规模,将是一个更好的近似。 对于基于节点的容器( std::set等),你会想乘节点的次数(元素的大致数目)每个节点的大小。 这仅准确,但是,如果分配不使用的节点优化的池分配器。

如果你真的想知道有多少内存被使用,然而,更好的策略是更换了全球operator newoperator delete ,并跟踪实际分配。 更准确的将是取代mallocfree 。 从形式上看,这是不允许的,但在实践中,我从来没有遇到过的地方不工作的落实。 在另一方面,如果更换mallocfree ,你必须自己实现实际的内存管理。 如果更换operator newoperator delete ,你可以使用mallocfree ,这使得它相当琐碎。

还要注意,每个分配都具有一些固定开销。 的每10个字节的10万点的分配会消耗显著更多的内存比的每100000个字节10个分配。



Answer 2:

std::vector<element>通常需要在总的sizeof +(元件)* 3个机器字capacity()的存储器中。 对于典型的实施方式中,所述开销包括指针的开始,结束和向量的当前大小。 元件本身被存储在连续的存储器。 capacity()典型地具有空间高达两倍元件的实际数量。

std::map<element, int>通常需要 每个元件 + 3机器字约2机器字+ [的sizeof(元素)+的sizeof(int)的] *的存储器num_elements。 对于典型的实现中,开销包括指针所存储的元件。 这些元素本身存储在一个二叉树,并指出了其父母和两个孩子。

随着经验的这些规则,所有你需要知道的是,每串字符的平均数量和总数量的字符串知道总内存消耗。



文章来源: Memory consumption by STL containers