Почему Visual Studio Diagnostic Tools показывает слишком много использования памяти?
Я написал этот кусок кода:
#include "Colour.h"
int main(int argc, char** argv) {
//sizeof(Colour) = 3
Colour* data = new Colour[8 * 8];
for (int y = 0; y < 8 * 8; y++)
{
data[y] = Colour::WHITE;
}
}
В этом примере Color - это структура размером три байта
Таким образом, я ожидаю, что эта программа выделит 8 * 8 * 3 = 192
байт. Но на панели инструментов диагностики это показывает использование 889 kB
?
Что странно, когда я копаю немного глубже, создавая снимок памяти, он показывает размер кучи 71kB
, Но, глядя на источник, он показывает только одно распределение размером 192 байта.
Что происходит? Возможно ли, что он выделяет всю эту память для кадра стека?
1 ответ
Ну, ваше приложение на самом деле не плавает в вакууме. Когда вы запускаете его, ОС также создает окно для вывода вашего приложения и запускает его, где-то удерживая дескриптор. Он выделяет некоторую память для стека (точное количество может варьироваться, и я думаю, что это можно изменить самостоятельно).
Сам процесс по сути является контейнером, который представлен объектом процесса ядра. Он также хранит некоторые данные, необходимые для его работы. Все вышеперечисленное требует памяти, и я полагаю, именно поэтому ваш (почти пустой) процесс выделяет так много.
Кроме того, если вы сделаете два снимка, один в начале выполнения вашего приложения (до выполнения первой строки), а другой после выполнения первой строки, вы увидите, что размер кучи увеличился примерно на величину Вы распределили память, и большая часть памяти была выделена до того, как ваш собственный код был нажат: