c++ - 如何解释内存分配延迟的急剧跳跃?

标签 c++ c windows memory windows-ce

Intel Celeron 847 配备 8GB 内存。 (C/C++ 不是 .NET)

这是在 Windows EC7 上运行的唯一线程/函数。

它只是循环分配 1MB 的内存,1000 次。

但是,在通过循环进行大约第 122 次迭代之后,分配跳转所需的时间从大约 47 微秒增加到 327 微秒。

有哪些可能的原因可以向我的老板解释这一点?

while ( i < ITERATIONS )
{
QueryPerformanceCounter(&li);
start = double(li.QuadPart) / PCFreq;

// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB

QueryPerformanceCounter(&li);
stop = double(li.QuadPart) / PCFreq;

delayAlloc[i] = stop - start;

}

enter image description here

编辑

为了确定,我又执行了 3 次测试,每次的结果都与此非常相似:

enter image description here

最佳答案

让我们简化您的代码并删除计时内容。

while ( i < ITERATIONS )
{
    // allocate 1MB
    ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
}

系统正在为您分配 1Mb 并返回给您地址。然后你要求另一个地址,并将新地址存储在你保存前一个地址的同一个变量中。

new 返回一个指针,而指针实际上只是分配的地址。它不是特殊的电子 key ,也不是具有作用域的对象,它只是内存中分配开始位置的数值。

当您不再需要内存时,您有责任告诉分配器。它无法知道您对该地址数据做了什么,无论您是否存储它。

while ( i < ITERATIONS )
{
    // allocate 1MB
    ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB

    delete [] ptr;
}

如果您不这样做,分配的内存将永远不会返回到池中,直到您的应用程序终止。

这意味着您的应用程序的内存占用量正在增长。在普通的 Windows 下,这可能不是问题,但您在 Windows 的嵌入式风格下运行,其中 一个 Mb 的内存已经是一个很大的数量。前 122Mb 可能已预留给您的应用。但是,一旦您分配了您的应用程序开始时使用的所有堆,分配器就必须调整其堆的大小,以便能够为您提供额外的分配,并且由于这是嵌入式 Windows,调整大小是悲观地完成的。

关于c++ - 如何解释内存分配延迟的急剧跳跃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277197/

相关文章:

windows - 如何通过 MSVS 2017 x64 命令行将链接器选项传递给 `cl`?

windows - 如何使用 MS-DOS 命令模拟 curl?

c++ - C语言中的多内存地址

c++ - 我的 LookAt 的 SSE 实现不起作用

c - 我的 for 循环响应不正确

c - 读取文件内容到内存,32位操作系统和64位操作系统结果不同

java - 如何将 FTP 链接复制到 Windows 系统剪贴板?

c++ - 动态分配的控制台 I/O 的 Visual Studio 2015 问题

python - 使用 OpenCV 同步多个 RTSP 流?

c - 如何使用 _spawn 或 _exec 进行引导?