Fra*_* Q. 10 c++ memory-management stl vector map
我正在开发一个应用程序,我计划使用几个STL容器.如果内存消耗达到阈值,应用程序将采取某些步骤.为此,我需要对STL容器使用的内存量进行接近准确的计算.
vector<string> StringList
map<string, int> mapstring
Run Code Online (Sandbox Code Playgroud)
这就是我估算内存的方式:
对于大小StringList,循环遍历向量的所有元素并继续添加字符串大小.
string size = sizeof(string) + string.capacity()*sizeof(char)
Run Code Online (Sandbox Code Playgroud)
然后最后添加到此 sizeof(StringList);
对于mapstring的大小,循环遍历容器的所有键,并继续添加字符串大小,然后添加int的大小mapstring.size()*sizeof(int).然后最后添加到此sizeof(mapstring);
我想更好的方法是指定自己的allocator类并跟踪其中的内存使用情况,但写一个可能是非平凡的.这个评估看起来不错吗?
Tem*_*Rex 11
A std::vector<element>通常需要3个机器字总数 + sizeof(元素)*capacity()的内存.对于典型的实现,开销包括指向向量的开始,结束和当前大小的指针.元素本身存储在连续的内存中.capacity()通常有足够空间容纳实际元素数量的两倍.
A std::map<element, int>通常总共需要2个机器字,每个元素需要 3个机器字+ [sizeof(element)+ sizeof(int)]*num_elements of memory.对于典型的实现,开销包括指向存储元素的指针.元素本身存储在二叉树中,指向其父节点和两个子节点.
根据这些经验法则,您需要知道的是每个字符串的平均字符数以及要知道总内存消耗的字符串总数.
Jam*_*nze 11
对于std::vector和std::string,容量,而不是大小,将是一个更好的近似.对于基于节点的容器(std::set等),您需要将节点数(大致是元素数)乘以每个节点的大小.但是,如果分配器不为节点使用优化池分配器,则这只是准确的.
如果你真的想知道有多少内存被使用,然而,更好的策略是,以取代全球operator new和
operator delete,并跟踪实际分配.更准确的是更换malloc和free.在形式上,这是不允许的,但在实践中,我从未遇到过无法实现的实现.在另一方面,如果更换malloc和free,你必须自己实现实际的内存管理.如果更换operator new和operator delete,你可以使用malloc和
free,这使得它相当琐碎.
另请注意,每个分配都有一些固定的开销.每个10个字节的100000个分配将比10个每个100000字节的分配消耗更多的内存.