GlobalMemoryStatusEx 不考虑新阵列

GlobalMemoryStatusEx doesn't account for new array

本文关键字:阵列 不考虑 新阵列 GlobalMemoryStatusEx      更新时间:2023-10-16

我在具有16 GB RAM的Windows 10上使用c ++ builder 10.2 Tokyo。如果我跑

uint64_t FreeMBs()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullAvailPhys / (1024 * 1024);
}
Mem0=FreeMBs();
std::vector<int64_t> v;
v.resize(1000000000); // 1 billion
Mem1=FreeMBs();

Mem0-Mem1大约是8 GB。

如果,而不是上述,我运行

Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();

那么 Mem0-Mem1 大约为零。如果我使用 malloc 为数组保留空间,Mem1 仍然或多或少与 Mem0 没有变化。我尝试设置 v[1000000000-1]=0 以查看是否触发了某些内容,但没有。

为什么它不考虑数组?

写入数组,您将看到不同的结果。

操作系统只是在需要之前使用物理页面支持您的分配。这是一个很好的策略,因为在许多情况下,应用程序要求内存,然后它们永远不会接触。通过等待满足分配,直到实际需要(写入页面时(,而是满足页面错误处理程序中的分配,整个系统将节省大量内存。

换句话说;当你分配内存时,你通常只得到一系列虚拟地址,但实际物理内存的映射/分配发生在以后(或者如果你从不接触它,甚至根本不会发生(。

此外,在某些情况下,如果您从未从您分配的内存中读取,那么编译器可能会优化该内存的所有存储,因为您显然不关心它。