c++ - GlobalMemoryStatusEx 不考虑新阵列

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

为什么不考虑数组?

最佳答案

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

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

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

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

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

相关文章:

c - 无法打开 d : drive 中的文件

c++ - 为什么即使在调用 UpdateWindow() 之后绘制消息也会丢失?

c++ - 删除远程用户帐户功能

.net - 如何从子线程或另一个线程到达父线程?

c++ - 获取程序的 32 位基地址,而不制作 64 位(仅)程序?

windows - 如何在批处理文件中回显换行符?

c++ - 程序陷入循环

c++ - 如何在 C++ 中跟踪无效指针?

c++ - 如何在类的方法参数中访问类私有(private)数据成员,我收到错误无效使用非静态数据成员

c++ - Win32 C++ : Child window is not visible