为什么在分配动态内存时虚拟内存没有减少



为什么当我尝试在每个循环中分配一个字节时,虚拟内存的数量从未减少,如statex.ullAvailVirtualcout所示???

如果我将动态内存分配更改为VirtualAlloc(),在每个循环中,我都可以看到虚拟内存的大小减少了4个字节,这是合乎逻辑的,因为页面的大小是4个字节。

#include <Windows.h>
#include <iostream>
int main()
{
unsigned int allocated = 0;
while (true)
{
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
GlobalMemoryStatusEx(&statex);
//Depleting the memory per byte.
char* dyn_mem = new char[1];
*dyn_mem = 'a';

std::cout << "There are " << statex.ullAvailVirtual / 1024 << " free  KB of virtual memory." << std::endl;
}
return 0;
}

您看到的是内存分配优化。有关分配和解除分配如何工作的更多详细信息,请参阅此答案。基本上,从操作系统一次分配每个字节是非常低效的(或者可能不可能同时分配(,因为它通常处理页面内存(在我的系统上是4KB(,而不是单个字节。

您平台的编译器供应商(如果您在这种情况下使用msvc,则为Microsoft(非常清楚这一点,并以处理子页分配的方式实现低级别内存分配。例如malloc可以在应用程序启动时分配一页存储器。程序在启动时可能不需要那么多内存,所以malloc会跟踪它从操作系统请求的内容以及应用程序从malloc请求的内容。如果malloc空间不足,它会向操作系统请求另一个页面。

标准库容器(如std::vector(的工作方式非常相似(请参见std::vector::resizestd::vector::reserve(。

如果您将分配增加到每次迭代10个字节(而不是1个(,您将看到内存变化相当快。在我的情况下,你可以看到转变的发生:

There are 137434705464 free  KB of virtual memory.
There are 137434705464 free  KB of virtual memory.
There are 137434705464 free  KB of virtual memory.
There are 137434701368 free  KB of virtual memory.
There are 137434701368 free  KB of virtual memory.
There are 137434701368 free  KB of virtual memory.

您可以看到有一个4096字节的更改,它与我的系统上的页面大小相匹配。此时,malloc(或使用的任何分配函数(用完了保留内存,并请求了一个新的块。

注意,我在这里使用malloc作为任何通用内存分配函数的占位符。

最新更新