内存五大分区:

■ 代码段:存放函数体的二进制代码
■ 文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放。(如:strcpy(p1, "123456"); 123456就存放在常量区)
■ 全局区:又叫做静态存储区,主要存放全局变量和静态变量。初始化和未初始化的分开存放。程序结束由系统释放。
下边重点说下栈区和堆区在C/C++和JS语言中的不同意义。
C/C++中
栈区:
由系统自动分配释放,速度快、操作方便,不需要程序员手动操作干预。主要用来存放函数的传参值、局部变量值等。其操作方式类似数据结构中的栈,先入后出、后入先出。栈区向地址减小的方向增长。
堆区:
由程序员向操作系统申请一块内存,当系统收到申请后会遍历一个记录内存空闲的地址链表,寻找第一个大于申请空间大小的堆结点分配给程序员,并从空闲链表中删除。分配速度慢、地址不连续、容易碎片化。并且系统不负责回收,需要程序员自己回收销毁。
JS中
栈内存:
存储值为基础类型(在内存中空间大小固定)的变量的名和值,如:Number, String, Boolean, Null, Undefined等。
存储值为引用类型(在内存中空间大小不固定)的变量的名和指针地址,该指针地址指向存储该对象具体值的堆内存地址。
随着执行环境的结束,系统回收销毁。(标记清除策略)
堆内存:
存放引用类型的具体数据。
所有引用引用它的变量都不存在时,系统回收销毁。(引用计数策略)

网友评论