Довольно простой вопрос. Однако я получаю ошеломляющие результаты в VS2019. Итак, я разработал несколько тестов, чтобы определить, что происходит, но не уверен, что делать с результатами.
Проблема: выделенная память вектора примерно в 1,5 раза больше ожидаемого размера вектора. Профиль памяти указывает неразрешенные распределения, которые примерно равны дополнительному значению, которое я вижу.
Мои испытания -
- Простая структура, содержащая char, float и int. Выделенное значение близко к вычисленному.
- Добавьте в структуру вектор из 40 целых чисел и проверьте выделение.
- Используйте 2 таких вектора вместо 1
- Используйте 6 сейчас!
- Используйте 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 МБ.
Редактировать: - Разбивка распределения памяти и кода. Что интересно, цифры, которые я получаю, остаются прежними.