Подтвердить что ты не робот

Как найти память, используемую любым объектом

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. У нас есть библиотека?

4b9b3361

Ответ 1

Если вы ищете полное использование памяти для объекта, это не может быть решено вообще в С++ - пока мы можем получить размер самого экземпляра через sizeof(), объект всегда может распределять память динамически, поскольку необходимо.

Если вы можете узнать, насколько велик отдельный элемент в контейнере, вы можете получить нижнюю границу:

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

Имейте в виду, что контейнеры могут по-прежнему выделять дополнительную память в качестве детали реализации, а для контейнеров, таких как vector и string, вы должны проверить выделен размер.

Ответ 2

Как мы можем найти используемую память (в байтов) по объекту и 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 s [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.

Edited

Для UncleBens я хочу уточнить свою мысль.

Насколько я понимаю вопрос ARV, необходимо знать, сколько памяти выделено для set:: set и std:: map, включая всю память, выделенную для элементов набора и карты. Таким образом, это не просто sizeof (terms).

Итак, я просто предложил очень простой распределитель. Не вдаваясь в подробности, это может выглядеть так:

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, и я просто спрашиваю своих распределителей, чтобы узнать, сколько памяти каждая моих контейнеров.

Ответ 3

Короткий ответ: Нет

Длинный ответ:
- > Основной объект да. sizeof (<TYPE> ), но это полезно только для ограниченных вещей.
- > Контейнер и его элементы: НЕТ

Если вы делаете предположения о структурах, используемых для реализации этих объектов, вы можете оценить их. Но даже это не очень полезно (кроме особого случая вектора).

Дизайнеры STL сознательно не определяли структуры данных, которые должны использоваться этими контейнерами. Для этого есть несколько причин, но один из них (по моему мнению) заключается в том, чтобы заставить людей делать предположения о внутренних компонентах и, таким образом, пытаться делать глупые вещи, которые не инкапсулируются интерфейсом.

Итак, тогда возникает вопрос, почему вам нужно знать размер?
Вам действительно нужно знать размер (маловероятно, но возможно).

Или есть задача, которую вы пытаетесь достичь, когда думаете, что вам нужен размер?

Ответ 4

Если вы ищете фактический блок памяти, это должно быть числовое значение указателя на него. (Затем просто добавьте количество байтов, и у вас есть конец блока).

Ответ 5

Оператор sizeof() должен это сделать:

size_t bytes = sizeof(Help::TermMap);