内存存储之五大分区,详述栈区和堆区的区别

内存五大分区:

■ 代码段:存放函数体的二进制代码

■ 文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放。(如:strcpy(p1, "123456");  123456就存放在常量区)

■ 全局区:又叫做静态存储区,主要存放全局变量和静态变量。初始化和未初始化的分开存放。程序结束由系统释放。

下边重点说下栈区和堆区在C/C++和JS语言中的不同意义。

C/C++中

栈区:

由系统自动分配释放,速度快、操作方便,不需要程序员手动操作干预。主要用来存放函数的传参值、局部变量值等。其操作方式类似数据结构中的栈,先入后出、后入先出。栈区向地址减小的方向增长。

堆区:

由程序员向操作系统申请一块内存,当系统收到申请后会遍历一个记录内存空闲的地址链表,寻找第一个大于申请空间大小的堆结点分配给程序员,并从空闲链表中删除。分配速度慢、地址不连续、容易碎片化。并且系统不负责回收,需要程序员自己回收销毁。

JS中

栈内存:

存储值为基础类型(在内存中空间大小固定)的变量的名和值,如:Number, String, Boolean, Null, Undefined等。

存储值为引用类型(在内存中空间大小不固定)的变量的名和指针地址,该指针地址指向存储该对象具体值的堆内存地址。

随着执行环境的结束,系统回收销毁。(标记清除策略)

堆内存:

存放引用类型的具体数据。

所有引用引用它的变量都不存在时,系统回收销毁。(引用计数策略)

你可能感兴趣的:(内存存储之五大分区,详述栈区和堆区的区别)