I am working on an application in which I am planning to use couple of STL containers. The application will take certain steps if memory consumption reaches a threshold. For that purpose I need to perform a close to accurate calculation on how much memory is used by STL containers.
vector<string> StringList
map<string, int> mapstring
This is how I am estimating memory:
For size of StringList, loop over all the elements of the vector and keep adding the string sizes.
string size = sizeof(string) + string.capacity()*sizeof(char)
Then finally add to this sizeof(StringList);
For size of mapstring, loop over all the keys of the container and keep adding the string sizes and then add the sizes of int which is mapstring.size()*sizeof(int). Then finally add to this sizeof(mapstring);
I guess a better approach would be specifying own allocator class and keeping track of memory usage inside it but writing one could be non-trivial. Does this estimation look good ?
For
std::vectorandstd::string, capacity, rather than size, wouldbe a better approximation. For node based containers (
std::set,etc.), you’d want multiply the number of nodes (roughly the number of
elements) times the size of each node. This only accurate, however, if
the allocator doesn’t use an optimized pool allocator for the nodes.
If you really want to know how much memory is being used, however, a
better strategy would be to replace the global
operator newandoperator delete, and keep track of the actual allocations. Even moreaccurate would be to replace
mallocandfree. Formally, this is notallowed, but in practice, I’ve never encountered an implementation where
it doesn’t work. On the other hand, if you replace
mallocandfree,you have to implement the actual memory management yourself. If you
replace
operator newandoperator delete, you can usemallocandfree, which makes it fairly trivial.Note too that each allocation has some fixed overhead. A 100000
allocations of 10 bytes each will consume significantly more memory than
10 allocations of 100000 bytes each.