GlobalMemoryStatusEx不考虑新数组

时间:2018-05-27 11:48:16

标签: c++ windows winapi

我在具有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来查看是否触发了某些内容但它没有。

为什么不考虑数组呢?

1 个答案:

答案 0 :(得分:5)

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

操作系统根本不会在需要之前使用物理页面支持您的分配。这是一个很好的策略,因为在很多情况下,应用程序会询问他们从未接触过的内存。通过等待满足分配直到实际需要(当你写入页面时)而不是满足页面错误处理程序中的分配时,整个系统会保存大量内存。

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

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