Почему 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 ответ

Решение

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

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

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

введите описание изображения здесь

Другие вопросы по тегам