Я написал этот кусок кода:
#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 байта.
Что происходит?
Возможно ли, что он выделяет всю эту память для кадра стека?
Ну, ваше приложение на самом деле не плавает в вакууме. Когда вы запускаете его, ОС также создает окно для вывода вашего приложения и запускает его, где-то удерживая дескриптор. Он выделяет некоторую память для стека (точное количество может варьироваться, и я думаю, что это можно изменить самостоятельно).
Сам процесс по сути является контейнером, который представлен объектом процесса ядра. Он также хранит некоторые данные, необходимые для его работы. Все вышеперечисленное требует памяти, и я полагаю, именно поэтому ваш (почти пустой) процесс выделяет так много.
Кроме того, если вы сделаете два снимка, один в начале выполнения вашего приложения (до выполнения первой строки), а другой после выполнения первой строки, вы увидите, что размер кучи увеличился примерно на величину память, которую вы выделили, и большая часть памяти была выделена до ваш собственный код был поражен:
Других решений пока нет …