首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GlobalMemoryStatusEx不考虑新数组

GlobalMemoryStatusEx不考虑新数组
EN

Stack Overflow用户
提问于 2018-05-27 11:48:15
回答 1查看 256关注 0票数 4

我在windows 10上使用带有16 GB内存的c++构建器10.2东京。如果我跑了

代码语言:javascript
复制
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。

如果,代替上面的,我运行

代码语言:javascript
复制
Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();

那么Mem0-Mem1大约是零。如果我使用malloc为数组预留空间,则Mem1与Mem0相比仍大致保持不变。我试着设置v1000000-1=0,看看它是否触发了什么,但没有。

为什么它不能解释数组呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-27 11:53:25

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

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50551817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档