Точное измерение потребления памяти для std :: map? [Дубликат]

STL уже не имеет такого метода.

Однако вы можете использовать функцию C strtok() с помощью std::string::c_str() , или вы можете написать свой собственный. Вот пример кода, который я нашел после быстрого поиска Google («Разделение строки STL»):

void Tokenize(const string& str,
              vector& tokens,
              const string& delimiters = " ")
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // Found a token, add it to the vector.
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
}

Взято из: http://oopweb.com/CPP/Documents/CPPHOWTO/ Volume / C ++ Programming-HOWTO-7.html

Если у вас есть вопросы о образце кода, оставьте комментарий, и я объясню.

И только потому, что он не реализует typedef, называемый итератором или перегрузкой, оператор << не означает, что это плохой код. Я использую C-функции довольно часто. Например, printf и scanf оба быстрее, чем std::cin и std::cout ( значительно), синтаксис fopen гораздо более дружелюбен для двоичных типов, и они также имеют тенденцию создавать меньшие EXE.

Не продавайте на этой «Элегантности более производительность "

10
задан Some programmer dude 7 August 2012 в 08:56
поделиться

2 ответа

Для std::vector и std::string емкость, а не размер, будет лучшим приближением. Для контейнеров на основе узлов (std::set и т. Д.) Вам нужно умножить количество узлов (примерно число элементов) на разность каждого узла. Однако это точно, если распределитель не использует оптимизированный распределитель пулов для узлов.

Однако, если вы действительно хотите знать, сколько памяти используется, лучшей стратегией было бы заменить глобальные operator new и operator delete и отслеживать фактические распределения. Еще точнее было бы заменить malloc и free. Формально это не допускается, но на практике я никогда не сталкивался с реализацией, когда она не работает. С другой стороны, если вы замените malloc и free, вы должны сами реализовать управление памятью. Если вы замените operator new и operator delete, вы можете использовать malloc и free, что делает его довольно тривиальным.

Также обратите внимание, что каждое выделение имеет некоторые фиксированные накладные расходы. 100000 распределений по 10 байт будут потреблять значительно больше памяти, чем 10 распределений по 100 000 байт.

11
ответ дан James Kanze 23 August 2018 в 18:43
поделиться

A std::vector<element> обычно принимает 3 машинных слова в общей сумме + sizeof (element) * capacity() памяти. Для типичных реализаций служебные данные состоят из указателей на начало, конец и текущий размер вектора. Сами элементы хранятся в непрерывной памяти. capacity() обычно имеет место в два раза больше фактического количества элементов.

A std::map<element, int> обычно занимает около 2 машинных слов в общей сложности + 3 машинных слова на элемент + [ sizeof (element) + sizeof (int)] * num_elements of memory. Для типичных реализаций служебные данные состоят из указателей на сохраненные элементы. Сами элементы хранятся в двоичном дереве с указателями на его родительский и два дочерних элемента.

С помощью этих эмпирических правил все, что вам нужно знать, - это среднее число символов в строке и общее количество чтобы узнать общее потребление памяти.

10
ответ дан TemplateRex 23 August 2018 в 18:43
поделиться
Другие вопросы по тегам:

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