C++ 如何查找任何对象使用的内存 类帮助 { 公众: 帮助(); ~Help(); typedef std::设置术语; typedef std::map TermMap; 类型定义标准::多映射术语映射; 私人: 术语地图术语; TermsMap TermsMap; };

C++ 如何查找任何对象使用的内存 类帮助 { 公众: 帮助(); ~Help(); typedef std::设置术语; typedef std::map TermMap; 类型定义标准::多映射术语映射; 私人: 术语地图术语; TermsMap TermsMap; };,c++,stl,memory-management,C++,Stl,Memory Management,我们如何找到对象term和termsMap使用的内存(字节)。我们有任何库吗?操作员应该这样做: class Help { public: Help(); ~Help(); typedef std::set<string> Terms; typedef std::map<string, std::pair<int,Terms> > TermMap; typedef std::mu

我们如何找到对象
term
termsMap
使用的内存(字节)。我们有任何库吗?

操作员应该这样做:

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

如果要查找实际内存块,则指向它的指针的数值应该是它。(然后只添加字节数,就有块的结束)。

如果你正在寻找一个对象的完整内存使用,这在C++中一般是解决不了的,而我们可以通过代码< > siZeFo()/<代码>来获得一个实例本身的大小,对象可以根据需要动态分配内存。p> 如果可以找出容器中单个元素的大小,则可以得到一个下限:

size_t bytes = sizeof(Help::TermMap);
size=sizeof(map)+元素大小之和;
但是请记住,容器仍然可以分配额外的内存作为实现细节,对于像
vector
string
这样的容器,您必须检查是否存在错误。

简短回答:否

长答案:
->基本对象是。sizeof()但这只对有限的事情有用。
->容器及其包含的成员:NO

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

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

那么问题就归结到为什么需要知道尺寸了?
你真的需要知道尺寸吗(不太可能,但可能)

或者,在您认为需要尺寸的地方,您是否正在尝试完成一项任务

我们怎样才能找到所使用的内存 字节)和 termsMap。我们有图书馆吗

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

size = sizeof(map<type>) + sum_of_element_sizes;
此分配器仅计算已分配和解除分配的字节数,对于实际分配和解除分配,请使用其成员std_分配器。我可能需要在gdb下调试它,以便在malloc()和free()上设置断点,以确保每个分配和解除分配实际上都通过我的分配器


如果您能指出这个想法的一些问题,我将不胜感激,因为我已经在运行于Windows、Linux和HP-UX的程序中实现了它,我只需询问分配器,以确定每个容器使用了多少内存。

sizeof
是一个运算符,而不是一个函数。Hmm。这似乎不起作用,原因有二:成员是私有的,不允许使用非静态成员变量的大小。有趣@e、 詹姆斯:把它做成大小(帮助::术语地图)啊。这就是当我回答问题而不是睡觉时发生的事情。谢谢,伙计们。答案是CW。把它看作是一个粗略的低估。在许多情况下,与映射一样,STL必须包含其他内容(映射是一个平衡树,因此它至少需要三个指针(左、右、父-父以保证快速的迭代器横向)和一些保持平衡不变量信息的方法,可能需要一个额外的值(整数、颜色字节)元素大小必须同时考虑键和值。戴维,将它改为下界以使其更清晰,其余的应该由实现细节来覆盖。我怀疑除非你的分配器使用一些非常OS特定的分配例程,否则你就不能告诉内存使用情况。如果我没弄错的话,如果你的代码是Co。n包含像
malloc(n);
这样的高级内容;可能仍然完全由实现定义实际“使用”了多少内存。关于
的另一点可能仍然是完全由实现定义实际“使用”了多少内存
。这是真的。例如,在HP-UX上,当您要求5个字节时,有时实际上分配了16个字节,因为libc关心内存碎片。但是,我也从HP-UX/Linux获得了有关分配给进程的内存量的信息。因此,我知道实际内存消耗更大。顺便说一句,ARV没有说他想知道容器的确切内存消耗,包括libc可能添加的内容。
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;
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_;
};