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;
};
我们如何找到对象term
和termsMap
使用的(以字节为单位)的内存。我们有图书馆吗?
答案 0 :(得分:13)
如果您正在寻找对象的完整内存使用情况,这在C ++中通常无法解决 - 虽然我们可以通过sizeof()
获取实例本身的大小,但对象始终可以分配内存根据需要动态。
如果您可以了解容器中单个元素的大小,则可以获得下限:
size = sizeof(map<type>) + sum_of_element_sizes;
请记住,容器仍然可以分配额外的内存作为实现细节,而对于像vector
和string
这样的容器,您必须检查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_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_;
};
此分配器仅计算已分配和已释放字节的数量,对于实际分配和释放,使用其成员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);