У меня есть очень простое приложение, которое сводится к следующему коду:
char* gBigArray[200][200][200];
unsigned int Initialise(){
for(int ta=0;ta<200;ta++)
for(int tb=0;tb<200;tb++)
for(int tc=0;tc<200;tc++)
gBigArray[ta][tb][tc]=new char;
return sizeof(gBigArray);
}
Функция возвращает ожидаемое значение 32000000 байт, что составляет приблизительно 30 МБ, однако в диспетчере задач Windows (и при условии, что она не точна на 100%) выдает Память (частный рабочий набор) значение около 157MB. Я загрузил приложение в VMMap от SysInternals и имею следующие значения:
Я не уверен, что означает Image (указан в разделе «Тип»), хотя не имеет значения, что его значение примерно соответствует ожидаемому. Что на самом деле выбрасывает для меня, так это значение кучи, из которого происходят очевидные огромные размеры.
Чего я не понимаю, так это почему? Согласно этому ответу , если я правильно понял, gBigArray будет помещен в сегмент данных или bss - однако я предполагаю, что каждый элемент является неинициализированным указателем, который будет помещен в сегмент bss. Почему тогда значение кучи будет на глупую величину больше, чем требуется?