GlobalMemoryStatusEx 不考虑新阵列
GlobalMemoryStatusEx doesn't account for new array
我在具有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 以查看是否触发了某些内容,但没有。
为什么它不考虑数组?
写入数组,您将看到不同的结果。
操作系统只是在需要之前使用物理页面支持您的分配。这是一个很好的策略,因为在许多情况下,应用程序要求内存,然后它们永远不会接触。通过等待满足分配,直到实际需要(写入页面时(,而是满足页面错误处理程序中的分配,整个系统将节省大量内存。
换句话说;当你分配内存时,你通常只得到一系列虚拟地址,但实际物理内存的映射/分配发生在以后(或者如果你从不接触它,甚至根本不会发生(。
此外,在某些情况下,如果您从未从您分配的内存中读取,那么编译器可能会优化该内存的所有存储,因为您显然不关心它。
相关文章:
- 不考虑模板构造函数
- 为什么子项目 CMAKE 不考虑 fno-sanitize,请禁用目标的消毒器
- 如何对向量进行排序<浮点数,字符串>而不考虑字符串
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- CFileFind不考虑目录的第一个文件
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- 矢量重新分配,而不考虑储备
- GlobalMemoryStatusEx 不考虑新阵列
- 如何创建一个程序来标识最长的子字符串回文,而不考虑字母大小写
- OpenGL不考虑GL_DIFFUSE位置光的距离
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- 为什么我的 2D 阵列不旋转?
- 如何对对象数组进行排序,而不考虑对象变量类型
- C++11:编译器何时将 {} 视为 std::initializer_list,何时不考虑?
- 为什么用于输入验证的 while 循环要么完全跳过循环,要么不考虑错误的输入
- 为什么在这种情况下不考虑依赖于参数的查找?
- 阵列不能两次将相同的名称保存,当要添加新字符串时,程序应检查以查看该名称是否已经存在
- 为什么这两个char阵列不相等
- 为什么不考虑特定值的模板