内存中的栈与堆与静态存储区与代码区

一个程序,是存在硬盘上的。当你运行它时,需要将它拷贝入内存中才能运行。在内存中分别存放在栈区,堆区,静态存储区,代码区。

首先着重说明,不存在常量区(它在静态存储区内)或是文字常量区(Java或许有),或是自由存储区(存在但是是抽象的)。

1.栈区存放存放函数的参数值,局部变量的值等,它处于内存中的高地址范围,每存入一个变量,就好似向栈中压入一个变量一样,即高地址向低地址生长。它的资源由编译器分配与释放,由于它在内存中是连续的,所以存释效率高
2.堆区存放类成员变量,所有类的实例和数组都是在堆上分配内存的,关键在于存放的是需要程序员手动分配与释放的变量(python做了优化),通过malloc/free或者new/delete(C++)。这里后者其实存储在的是自由存储区,但free store是个抽象概念将其归入堆中不全对但也无大错。堆区位于内存中的低地址区范围,像链表一样存入一个个malloc或者new的对象,即低地址向高地址生长,由于它在内存中可以不是连续的,所以存释效率低
3.静态存储区存放静态变量、全局变量与常量,它在内存中的位置位于堆下面。在C中静态存储区还分为初始化的和未初始化的区分别存放相应的变量(当然常量存放在初始化的区了)。在C++中没这种区分,直接就都存了。C++中这个区甚至可以存new出来的对象,所以说new出来的对象存在了自由存储区(自由嘛,自由选择存的位置)。new是通过重载构造函数来实现自由选择的。这也是和malloc的一个大区别之一,malloc不能重载。静态存储区中存放的数据初始化后将伴随程序走到最后,举个例子

#include <iostream>

using std::cout;
using std::endl;
int global = 1; //全局变量
static int sg = 2; // 静态全局变量
void func()
{
	static int funs = 3; //静态局部变量
	cout << funs << endl;
	funs++;
}
int main()
{
	cout << global<<endl; //1
	cout << sg << endl; //2
	func(); //3
	func(); //4
}

4.代码区就是存放你的程序的编译后的可执行代码的地方了,CPU执行的机器指令,并且是只读的。存放代码,不允许修改,但可以执行。

posted @ 2020-03-12 17:37  风亦缘^_^  阅读(405)  评论(0编辑  收藏  举报