我在具有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来查看是否触发了某些内容但它没有。
为什么不考虑数组呢?
答案 0 :(得分:5)
写入数组,您会看到不同的结果。
操作系统根本不会在需要之前使用物理页面支持您的分配。这是一个很好的策略,因为在很多情况下,应用程序会询问他们从未接触过的内存。通过等待满足分配直到实际需要(当你写入页面时)而不是满足页面错误处理程序中的分配时,整个系统会保存大量内存。
换句话说;当您分配内存时,您通常只会获得一系列虚拟地址,但实际物理内存的映射/分配会在以后发生(如果您从未触摸它,甚至根本不会发生)。
此外,在某些情况下,如果您从未从您分配的内存中读取,那么编译器可能会将所有商店优化到该内存,因为您显然不关心它。 / p>