如何查找任何对象使用的内存

ARV*_*ARV 21 c++ memory-management stl

class Help
{
public:
        Help();
        ~Help();

        typedef std::set<string> Terms;
        typedef std::map<string, std::pair<int,Terms> > TermMap;
        typedef std::multimap<int, string, greater<int> > TermsMap;

private:

        TermMap  terms;
        TermsMap    termsMap;
};
Run Code Online (Sandbox Code Playgroud)

我们怎样才能找到所使用的内存(以字节为单位)的对象termtermsMap.我们有图书馆吗?

Geo*_*che 13

如果您正在寻找对象的完整内存使用情况,这在C++中通常无法解决 - 虽然我们可以通过实时获取实例的大小sizeof(),但对象始终可以根据需要动态分配内存.

如果您可以找出容器中单个元素的大小,则可以获得下限:

size = sizeof(map<type>) + sum_of_element_sizes;
Run Code Online (Sandbox Code Playgroud)

请记住,虽然容器仍然可以分配额外的内存作为实现细节,而对于像容器一样vector,string您必须检查分配的大小.


Ser*_*kov 8

我们如何找到对象term和termsMap使用的内存(以字节为单位).我们有图书馆吗?

您应该使用自己的分配器类型.

typedef std::set<string, 
    your_allocator_1_that_can_count_memory_consumption_t> Terms;

typedef std::map<string, std::pair<int,Terms>,
    your_allocator_2_that_can_count_memory_consumption_t> TermMap;

typedef std::multimap<int, string, greater<int>, 
    your_allocator_3_that_can_count_memory_consumption_t> TermsMap;
Run Code Online (Sandbox Code Playgroud)

我还没有检查std :: string的这个想法,所以如果很难实现,只需使用你自己的类fixed_string,它只包含char [max-string-lenght].

而当你在你的程序需要找出内存消耗只是得到它your_allocator_1_that_can_counts_memory_consumption_t,your_allocator_2_that_can_counts_memory_consumption_t, your_allocator_3_that_can_counts_memory_consumption_t.

编辑

对于UncleBens,我想澄清一下我的观点.

据我了解ARV的问题,有必要知道为set :: set和std :: map分配了多少内存,包括为集合元素和映射分配的所有内存.所以这不仅仅是sizeof(条款).

所以我刚建议一个非常简单的分配器.没有太多细节,它可能看起来像这样:

template <class T>
class your_allocator_1_that_can_counts_memory_consumption_t {
public:
   // interfaces that are required by the standart
private:
   std::allocator<T> std_allocator_;
   // here you need to put your variable to count bytes
   size_t globale_variable_for_allocator_1_to_count_bytes_;
};
Run Code Online (Sandbox Code Playgroud)

此分配器仅计算已分配和已释放字节的数量,对于实际分配和释放,使用其成员std_allocator_.我可能需要在gdb下调试它,以便在malloc()和free()上设置断点,以确保每个分配和释放实际上都通过我的分配器.

如果你指出我对这个想法的一些问题,我将不胜感激,因为我已经在我的程序中实现了它,在Windows,Linux和HP-UX上运行,我只是询问我的分配器,以便找到每个容器的内存量使用.


Mar*_*ork 7

简答:不

长答案:
- >基本对象是.sizeof(<TYPE>)但这仅适用于有限的事情.
- >容器及其包含的成员:NO

如果您对用于实现这些对象的结构做出假设,则可以对其进行估计.但即使这样也没有用(除了矢量的特殊情况).

STL的设计者故意没有定义这些容器应该使用的数据结构.这有几个原因,但其中一个(在我看来)是阻止人们对内部进行假设,从而尝试做一些没有被界面封装的愚蠢的事情.

那么问题就是为什么你需要知道尺寸?
你真的需要知道大小(不太可能,但可能).

或者您是否正在尝试实现您认为需要大小的任务?


e.J*_*mes -3

操作sizeof()员应该这样做:

size_t bytes = sizeof(Help::TermMap);
Run Code Online (Sandbox Code Playgroud)

  • `sizeof` 是一个运算符,而不是一个函数。 (5认同)
  • @e.James:将其设置为 sizeof(Help::TermMap) (2认同)