静态局部变量没有物理内存
Static local variable taking up no physical memory
我创建了以下函数来检查静态局部变量的内存使用情况,并期望该数组大约占据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仅分配内存,然后
相关文章:
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- C++在局部变量的内存上是否有上限
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 静态局部变量没有物理内存
- 为什么堆栈中的函数局部变量之间存在内存空间
- 局部变量保存相同的内存地址
- 两个策略的局部变量的内存碰撞
- 返回的与局部变量关联的堆栈内存的地址 (C++)
- 在范围内存在不可复制的局部变量时按值捕获
- 局部变量的内存地址根据 lambda 参数的预感而变化
- 为什么为堆栈中的局部变量分配的内存多于C++中所需的内存
- 需要释放具有保留内存的 c++ Do 局部变量
- 如何为局部变量分配内存
- 指针可以将局部变量的内存指向其范围之外?
- 为什么c++程序要为局部变量分配比在最坏情况下需要的更多的内存?
- 在c++中,通常在什么时候为局部变量分配内存?
- 局部变量在超出作用域时删除另一个变量的内存
- 是否可以在其范围之外访问局部变量的内存?
- c程序的内存布局,关于局部变量和全局变量的位置
- c++内存管理对局部变量的内存分配