我在windows 10上使用带有16 GB内存的c++构建器10.2东京。如果我跑了
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大约是8GB。
如果,代替上面的,我运行
Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();那么Mem0-Mem1大约是零。如果我使用malloc为数组预留空间,则Mem1与Mem0相比仍大致保持不变。我试着设置v1000000-1=0,看看它是否触发了什么,但没有。
为什么它不能解释数组呢?
发布于 2018-05-27 11:53:25
写入数组,您将看到不同的结果。
操作系统根本没有在需要之前用物理页面来支持您的分配。这是一种很好的策略,因为在许多情况下,应用程序都要求内存,而这些内存是它们从未接触过的。通过等待满足分配直到实际需要(当您写入一个页面时),而不是满足页面错误处理程序中的分配,整个系统节省了大量内存。
换句话说,当您分配内存时,通常只会得到一系列虚拟地址,但是对实际物理内存的映射/分配会在稍后发生(如果您从未碰过它,甚至根本不会)。
此外,在某些情况下,如果您从未从分配的内存中读取,那么编译器可能会优化该内存的所有存储,因为您显然并不关心它。
https://stackoverflow.com/questions/50551817
复制相似问题