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

在此示例中,Color 是一个 3 个字节大的结构

因此我希望这个程序分配8 * 8 * 3 = 192字节。但是在诊断工具面板中,它显示了889 kB?

在此处输入图像描述

奇怪的是,当我深入挖掘时,通过创建内存快照,它显示的堆大小为71kB. 但是在查看源代码时,它只显示了一个大小为 192 字节的分配

怎么了?是否有可能为堆栈帧分配所有内存?

4

1 回答 1

1

好吧,您的应用程序并没有真正漂浮在真空中。当您启动它时,操作系统还会为您的应用程序输出创建一个窗口并启动它,并在某处持有它的句柄。它为堆栈分配了一些内存(确切的数量可能会有所不同,我认为可以自己更改)。

进程本身本质上是一个由内核进程对象表示的容器。它还存储了一些操作它所需的数据。以上所有内容都需要内存,我想这就是您的(几乎是空的)进​​程分配这么多的原因。

此外,如果您制作两个快照,一个在应用程序执行开始时(在执行第一行之前),另一个在执行第一行之后,您会看到堆大小正好增加了您分配的内存,并且在您自己的代码被命中之前已分配了大部分内存:

在此处输入图像描述

于 2017-01-20T06:28:38.543 回答