静态局部变量没有物理内存

Static local variable taking up no physical memory

本文关键字:物理内存 局部变量 静态      更新时间:2023-10-16

我创建了以下函数来检查静态局部变量的内存使用情况,并期望该数组大约占据5MB的内存,但是当我运行它时,该过程的物理内存使用仅仅是0,2MB并在我为数组中的每个元素设置值时上升。

我的理解是,当我首次初始化它时,无论其中元素的值如何。因为我能够访问数组的第一个也是最后一个元素,而内存则在介于介于之间的位置?

之间
void func() {
  static char a[5000000];
  a[0] = 'a';
  a[4999999] = 'a';
  cin >> a;
}
int main(int argc, char const *argv[]) {
  func();
  return 0;
}

这是由于懒惰的内存分配或按需填充零,如下所述。

这是在cppReference处的零初始化中解释的:

零初始化将在以下情况下执行:

1对于任何其他初始化之前,每个命名变量的静态或线本位存储持续时间(由于C 14)。

因此,此变量有资格。这是什么意思零初始化

零初始化的影响是:

  • 如果t是标量类型,则对象的初始值是明确转换为t。
  • 的积分常数零
  • [...]如果t是数组类型,则每个元素都是零始于

作为一种优化,大多数现代系统甚至都没有为零初始化的全局/静态变量分配任何内存,这就是为什么数组大小不影响内存使用情况的原因。相反,可执行文件的标记说:"这里应该是零值",仅此而已。当程序加载时,所有地址映射到包含零的物理RAM的小且共享的只读块。

几个虚拟地址可以通过CPU中的硬件映射到相同的内存,该硬件称为"内存管理单元"(MMU)。当代码试图写入范围内的一个地址时,MMU通知操作系统(OS)有人正在编写仅读取的内存块,并且OS仅分配内存,然后