【发布时间】:2012-08-04 04:42:09
【问题描述】:
我正在开发一个应用程序,我计划在其中使用几个 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);
我想一种更好的方法是指定自己的分配器类并跟踪其中的内存使用情况,但编写一个可能并非易事。这个估计好看吗?
【问题讨论】:
-
类似问题:stackoverflow.com/questions/2160300/… stackoverflow.com/questions/720507/… 这是获得粗略下限的合理方法,但开销可能比您想象的要多得多。例如,
std::map元素必须包含各种额外的指针,以及与保持平衡相关的信息,... Valgrind 工具 massif 跟踪堆分配,并且可能有助于分析您的程序内存使用情况。 -
它还取决于您使用的 STL 实现。例如STLPort 或 gcc STL
-
“我想一种更好的方法是指定自己的分配器类并跟踪其中的内存使用情况,但编写一个可能并非易事。” -- 这确实是最好的方法,比事后猜测 STL 实现要好得多。
-
你不能问操作系统进程使用了多少内存吗?
-
通常应用程序不会消耗它使用的任何内存。
标签: c++ memory-management stl map vector