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

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

21
задан Seth 29 January 2010 в 06:32
поделиться

5 ответов

Размер SIZEOF () Оператор должен сделать это:

size_t bytes = sizeof(Help::TermMap);
-2
ответ дан 29 November 2019 в 21:35
поделиться

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

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

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

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

13
ответ дан 29 November 2019 в 21:35
поделиться

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

1
ответ дан 29 November 2019 в 21:35
поделиться

Краткий ответ: NO

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

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

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

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

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

7
ответ дан 29 November 2019 в 21:35
поделиться

Как мы можем найти использованную память (в байты) сроком объектов и Условие. У нас есть ли у нас библиотека?

Вы должны использовать свой собственный тип распределения.

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 .

Отредактировано

для дядлей, я хочу уточнить мою точку зрения.

Насколько я понимаю, вопрос о ARV необходимо знать, сколько памяти выделено для набора :: Set и STD :: Map, включая все память, выделенные для элементов набора и карты. Так что это не просто размер (термины).

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

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

Я был бы признателен, если вы укажете мне некоторые проблемы с этой идеей, так как я уже реализовал его в моей программе, которая работает на Windows, Linux и HP-UX, и я просто просит моих распределителей, чтобы найти, сколько памяти каждый моих контейнеров используют.

8
ответ дан 29 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: