Использование памяти в векторе структуры - PullRequest
0 голосов
/ 27 мая 2020

Довольно простой вопрос. Однако я получаю ошеломляющие результаты в VS2019. Итак, я разработал несколько тестов, чтобы определить, что происходит, но не уверен, что делать с результатами.

Проблема: выделенная память вектора примерно в 1,5 раза больше ожидаемого размера вектора. Профиль памяти указывает неразрешенные распределения, которые примерно равны дополнительному значению, которое я вижу.

Мои испытания -

  1. Простая структура, содержащая char, float и int. Выделенное значение близко к вычисленному.
  2. Добавьте в структуру вектор из 40 целых чисел и проверьте выделение.
  3. Используйте 2 таких вектора вместо 1
  4. Используйте 6 сейчас!
  5. Используйте 2 вектора, но не резервируйте весь размер вектора
#include <vector>
struct wow
{
    char a;
    int glint;
    int b;
    std::vector<int> length = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    wow(char k, int g, long c)
    {
        a = k;
        glint = g;
        b = c;
    }
};
int main()
{
    std::vector<wow> tr;
    tr.reserve(180000);
    for (int i = 0; i < 180000; ++i)
        tr.emplace_back('g', 23, 6345345);
}

В испытаниях 2, 3 и 4 выделенная / использованная память была примерно в 1,5 раза больше расчетного значения! И это несмотря на резервирование необходимого количества элементов в векторе. Распределение памяти в куче более или менее соответствовало памяти, используемой в диспетчере задач. Учитывая, что мне удалось сопоставить распределение памяти для первого случая, разумно предположить, что они будут совпадать и в других случаях.

Первоначально я предполагал, что неспособность оператора sizeof определить размер вектора приводит к повторным перераспределениям, но это не так. Профиль памяти растет линейно без кратковременного скачка, характерного для перераспределения (5-е испытание). Разбивка распределения памяти показана в ссылке. Это указывает на то, что из 42 МБ (всего) 35 МБ затрачены на оператор присваивания и 7 МБ на выделение вектора. Для меня это не имеет смысла. Может кто-нибудь уточнить?

Распределение памяти для справки. Ожидаемые (расчетные) значения для четырех пробных версий: 2,05 МБ, 29,52 МБ, 57,0 МБ и 166,8 МБ. Фактическое выделение (по VS2019) составляет 2,58 МБ, 46,53 МБ, 82,4 МБ и 266,25 МБ.

Редактировать: - Разбивка распределения памяти и кода. Что интересно, цифры, которые я получаю, остаются прежними.

1 Ответ

1 голос
/ 27 мая 2020

Благодаря @dxiv мне удалось сопоставить использование памяти в тестовых примерах. Я добавляю здесь ответ в качестве ссылки.

Основная проблема заключалась в том, что я работал в режиме отладки, а не в режиме выпуска. Изменение этого параметра уменьшило выделенную память почти на 20% и привело к определению фактического объема выделенной памяти.

Другая часть несоответствия была связана с моей неверной оценкой размера вектора. STL - это динамические c структуры данных, которые выделяют память из кучи для каждого добавленного элемента. Вектор, по крайней мере, определяется тремя указателями: один на начало, один на конец и один на емкость вектора. Я тоже упустил эти 12B распределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...