gpt4 book ai didi

c++ - GlobalMemoryStatusEx 不考虑新阵列

转载 作者:可可西里 更新时间:2023-11-01 14:02:16 32 4
gpt4 key购买 nike

我在具有 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 以查看是否触发了什么,但没有。

为什么不考虑数组?

最佳答案

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

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

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

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

关于c++ - GlobalMemoryStatusEx 不考虑新阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50551817/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com