为什么C 全局变量不影响程序的内存使用情况

Why the C++ global variable not affect to memory usage of program

本文关键字:内存 用情 情况 程序 全局变量 影响 为什么      更新时间:2023-10-16

在我的程序中,我声明了初始化的全局变量(作为数组)。但这仅影响可执行文件的大小,该程序的内存使用情况不受影响。

我的程序就像那个

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中腾出空间,以获取更频繁使用的数据。如果未修改,则可以将其丢弃(因为可以在需要时从磁盘上的原始文件重新加载)。

执行时使用的内存的原因明显小于您的硬盘驱动器(或固态驱动器)以存储可执行文件所需的空间,因为您是因为您不将数组本身拉到内存中。

在您的程序中,您永远不会访问或调用您的数组 - 单独使用单独将记忆同时带入记忆。因此,与可执行文件的大小相比,运行可执行文件所需的内存非常小(必须存储您的大型数组)。

我希望这是有道理的。两者之间的区别在于一个正在执行,一个存储在计算机的内部磁盘上。只有在记忆中才能执行某件事。