为什么C 全局变量不影响程序的内存使用情况
Why the C++ global variable not affect to memory usage of program
在我的程序中,我声明了初始化的全局变量(作为数组)。但这仅影响可执行文件的大小,该程序的内存使用情况不受影响。
我的程序就像那个
char arr[1014*1024*100] = {1};
int _tmain(int argc, _TCHAR* argv[])
{
while (true)
{
}
return 0;
}
可执行文件的大小为118MB,但是运行程序时的内存使用率仅为0.3MB
任何人都可以为我解释吗?
大多数使用的操作系统都使用了需求页的虚拟内存。
这意味着,加载程序时,该程序的可执行文件不允许立即加载到内存中。相反,设置虚拟内存页面以将文件映射到内存。当(如果)实际上是参考一个地址时,会导致页面故障,然后,操作系统通过将文件的适当部分读取到物理内存中来处理,然后让指令重新执行。
在您的情况下,您不参考arr
,因此OS永远不会将这些数据拉到内存中。
如果您要查看程序使用的虚拟地址空间(而不是您现在正在查看的物理内存),则可能会看到为所有arr
分配的地址空间。虚拟地址空间通常并不是很有趣或有用的检查,因此大多数告诉您内存使用情况的事情都会告诉您用于存储实际数据的物理RAM,而不是分配但从未使用过的虚拟地址空间。
即使您确实参考了数据,操作系统也可以很聪明:根据您参考数据的频率(以及是否修改),只有一部分数据可以在任何给定的给定的数据中加载到RAM中时间。如果对其进行了修改,则可以将修改的部分写入分页文件,以在RAM中腾出空间,以获取更频繁使用的数据。如果未修改,则可以将其丢弃(因为可以在需要时从磁盘上的原始文件重新加载)。
执行时使用的内存的原因明显小于您的硬盘驱动器(或固态驱动器)以存储可执行文件所需的空间,因为您是因为您不将数组本身拉到内存中。
在您的程序中,您永远不会访问或调用您的数组 - 单独使用单独将记忆同时带入记忆。因此,与可执行文件的大小相比,运行可执行文件所需的内存非常小(必须存储您的大型数组)。
我希望这是有道理的。两者之间的区别在于一个正在执行,一个存储在计算机的内部磁盘上。只有在记忆中才能执行某件事。
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 针对某些特定用例的C++原子内存排序
- 用C++压缩内存中的位图
- 用c++防止内存泄漏
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 大约"circular reference",我用了weak_ptr但仍然发生内存泄漏
- 你能用内存反序列化字节吗?
- 使用重载的 new 和 delete 运算符跟踪已用内存
- 用C 和Marshall分配给C#的内存
- 当我用clang编译代码时,GCOV会出现内存错误
- 用多个传感器克服Arduino内存限制
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- CUDA:共享内存的超载以用多个数组实现还原方法
- 我可以动态分配以前分配的内存,但用不同的指针分配
- 从多个线程写入内存区域是否会导致争用?
- 用valgrind分析c++字符内存泄漏
- 为什么用空函数运行std::线程会花费大量内存
- 用new分配4k int后的内存覆盖
- 定义一个C宏并将内存地址设置为用C和C++编写的结构成员
- 除了内存管理,QObject的父级是做什么用的?