我的工作中,我打算用几个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);
我想一个更好的办法是指定自己的分配器类,并跟踪其内部的内存使用情况,但是写一个可能是不平凡的。 这是否估计好看吗?
对于std::vector
和std::string
,能力,而不是规模,将是一个更好的近似。 对于基于节点的容器( std::set
等),你会想乘节点的次数(元素的大致数目)每个节点的大小。 这仅准确,但是,如果分配不使用的节点优化的池分配器。
如果你真的想知道有多少内存被使用,然而,更好的策略是更换了全球operator new
和operator delete
,并跟踪实际分配。 更准确的将是取代malloc
和free
。 从形式上看,这是不允许的,但在实践中,我从来没有遇到过的地方不工作的落实。 在另一方面,如果更换malloc
和free
,你必须自己实现实际的内存管理。 如果更换operator new
和operator delete
,你可以使用malloc
和free
,这使得它相当琐碎。
还要注意,每个分配都具有一些固定开销。 的每10个字节的10万点的分配会消耗显著更多的内存比的每100000个字节10个分配。
甲std::vector<element>
通常需要在总的sizeof +(元件)* 3个机器字capacity()
的存储器中。 对于典型的实施方式中,所述开销包括指针的开始,结束和向量的当前大小。 元件本身被存储在连续的存储器。 capacity()
典型地具有空间高达两倍元件的实际数量。
甲std::map<element, int>
通常需要在 每个元件 总 + 3机器字约2机器字+ [的sizeof(元素)+的sizeof(int)的] *的存储器num_elements。 对于典型的实现中,开销包括指针所存储的元件。 这些元素本身存储在一个二叉树,并指出了其父母和两个孩子。
随着经验的这些规则,所有你需要知道的是,每串字符的平均数量和总数量的字符串知道总内存消耗。