【问题标题】:Why the C++ global variable not affect to memory usage of program为什么 C++ 全局变量不影响程序的内存使用
【发布时间】:2017-02-24 02:38:32
【问题描述】:

在我的程序中,我声明了一个初始化的全局变量(作为一个数组)。 但它只影响可执行文件的大小,不影响程序的内存使用。

我的程序是这样的

char arr[1014*1024*100] = {1};

int _tmain(int argc, _TCHAR* argv[])
{
    while (true)
    {

    }
    return 0;
}

可执行文件大小为118MB,但运行程序时内存占用仅为0.3MB

谁能帮我解释一下?

【问题讨论】:

标签: c++ c


【解决方案1】:

大多数操作系统使用按需分页虚拟内存。

这意味着当您加载程序时,该程序的可执行文件不允许立即加载到内存中。相反,虚拟内存页面被设置为将文件映射到内存。当(并且如果)您实际引用一个地址时,会导致页面错误,然后操作系统通过将文件的适当部分读入物理内存来处理该错误,然后让指令重新执行。

在您的情况下,您没有引用 arr,因此操作系统永远不会将该数据拉入内存。

如果您要查看程序使用的虚拟地址空间(而不是您现在显然正在查看的物理内存),您可能会看到分配给所有arr 的地址空间。但是,虚拟地址空间通常不是很有趣或有用,因此大多数告诉您内存使用情况的信息只会告诉您用于存储实际数据的物理 RAM,而不是已分配但从未使用过的虚拟地址空间.

即使您确实引用了数据,操作系统也可能相当聪明:取决于您引用数据的频率(以及您是否修改它),在任何给定的情况下,只有部分数据可能会加载到 RAM 中时间。如果它已被修改,则可以将修改后的部分写入页面文件,以便在 RAM 中为更经常使用的数据腾出空间。如果没有修改,则可以丢弃(因为可以在需要时从磁盘上的原始文件重新加载原始数据)。

【讨论】:

  • @VadaPoché:发布的第一个答案通常会获得公平(不公平?)数量的赞成票,只要它至少相当不错。这就是 SO 上的生活。
  • @VadaPoché 西部最快的枪有优势,但要冒险。犯了一个错误,早期的支持者会变得无情。也就是说,+10 代表上升,只有 -1 代表下降意味着权衡通常对你有利。
  • @JerryCoffin 您还可以回答在哪种情况下程序的内存使用量真的会增加吗?例如填充所有值或引用数组
  • @JerryCoffin:如果我将全局变量更改为 const,可执行文件的大小只有 35KB。你知道为什么吗?
【解决方案2】:

执行可执行文件时使用的内存远小于硬盘驱动器(或固态驱动器)上存储可执行文件所需的空间,这是因为您没有将阵列本身拉入内存。

在您的程序中,您永远不会访问或调用您的数组——更不用说同时并行地把所有数据都带入内存。因此,与可执行文件的大小(必须存储大量数组)相比,运行可执行文件所需的内存非常小。

我希望这是有道理的。两者的区别在于,一个正在执行,一个存储在您计算机的内部磁盘上。某些东西只有在被带入内存时才会被执行。

【讨论】:

  • 我已经尝试在 main 函数中访问我的数组,但内存使用仍然没有改变。数组数据是否在程序的整个生命周期中都存储在磁盘驱动器中?
  • @tuanpm 这个问题的答案包含在下面 Jerry Coffin 的答案中。按需分页虚拟内存是关键字。仅仅因为你声明了一个变量,内存不会立即提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2015-09-02
  • 1970-01-01
  • 2013-09-25
  • 2021-05-16
相关资源
最近更新 更多