2017-01-20 2 views
3

Я написал этот кусок кода:Почему визуальные студийные диагностические инструменты демонстрируют значительное использование памяти?

#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; 
    } 
} 

В этом примере цвет является структурой, которая составляет три байта большого

Таким образом, я бы ожидать, что эта программа выделит 8 * 8 * 3 = 192 байт. Но в панели диагностических инструментов показано использование 889 kB?

enter image description here

Что странно, когда я копать немного глубже, путем создания снимка памяти, он показывает размер кучи 71kB. Но при просмотре источника он показывает только одно распределение размера 192 байта

Что происходит? Возможно ли, что он распределяет всю эту память для фрейма стека?

+0

Ваше само приложение потребляет память тоже. Посмотрите размер выходного файла .EXE. – Icemanind

ответ

1

Хорошо, что ваше приложение действительно не плавает в вакууме. Когда вы запускаете его, ОС также создает окно для вывода вашего приложения и запускает его, удерживая в нем дескриптор. Он выделяет некоторую память для стека (точное количество может меняться, и я думаю, что его можно изменить самостоятельно).

Сам процесс по существу представляет собой контейнер, который представляет собой объект процесса ядра. Он также хранит некоторые данные, необходимые для его работы. Все вышесказанное требует памяти, и я полагаю, поэтому ваш (почти пустой) процесс выделяет так много.

Также, если вы сделали два моментальных снимка, один в начале выполнения вашего приложения (до выполнения первой строки), а другой после первой строки, вы увидите, что размер кучи увеличился примерно точно от объема памяти выделяется, и большая часть памяти была выделена до того свой собственный код был поражен:

enter image description here

+0

Спасибо, что очищает его для меня. Но почему бы Visual Studio не ограничивать разницу в памяти между вашим кодом и ОС? –

+0

@CameronBell, почему? Он показывает источник распределения памяти, и этого должно быть достаточно, чтобы отличать ваши собственные распределения от распределений ОС. Оставить только память вашего собственного кода на графике может ввести в заблуждение, потому что вы все равно не знаете, сколько памяти использует ваше приложение в целом. – SingerOfTheFall

Смежные вопросы