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

时间:2010-01-29 06:30:44

标签: c++ stl memory-management

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;
};

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

5 个答案:

答案 0 :(得分:13)

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

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

size = sizeof(map<type>) + sum_of_element_sizes;

请记住,容器仍然可以分配额外的内存作为实现细节,而对于像vectorstring这样的容器,您必须检查allocated size

答案 1 :(得分:8)

  

我们如何找到所使用的内存(in   字节)由对象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;

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

当您需要在程序中查找内存消耗时,只需从your_allocator_1_that_can_counts_memory_consumption_tyour_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_;
};

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

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

答案 2 :(得分:7)

简答:否

长答案:
- &GT;基本对象是。 sizeof(&lt; TYPE&gt;)但这只适用于有限的事情 - &GT;容器及其包含的成员:

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

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

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

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

答案 3 :(得分:1)

如果你正在寻找实际的内存块,指向它的指针的数值应该是它。 (然后只需添加字节数,就可以得到块的结尾了。)

答案 4 :(得分:-1)

sizeof()运营商应该这样做:

size_t bytes = sizeof(Help::TermMap);