静态储存,堆,栈的理解
数据结构中的堆与栈
栈 :可以理解为为一个瓶子,他遵循着先进后出的原则
堆 :是一种经过排序的树状结构,每一个节点都有一个值,我们通常说的堆是二叉堆,堆的特点是跟节点最大或者最小,且子节点也是一个堆,所以我们在使用的堆的时候,都是随便取一个节点,并没有什么顺序
内存的基本概述
栈: 编译器自动申请和自动释放的区域,存放函数的参数值,和一些局部变量,在windows 大小一般为1M,在linux下一般为8M
堆: 是由程序员手动申请和释放,但是他与数据结构的堆还是有区别的,他的分配类似于链表,大小接近4G
全局区(静态区):静态变量和全局变量是存储在一起的,他会伴随着程序结束才会被释放,.data()存放的已经初始化的全局变量,而.bss下存放的未被初始化的
文字常量区 :存放常量,如字符串常量
程序代码区 :存放程序的代码,并且是只读的
详解
上面的是一个详细的内存分布的图,我们可以看到各个内存的存放方式
- 栈(stack) :是从高地址向地址延深的,他处于最高的地方,他一般用在存储一些局部变量,模块结束后就自动的销毁,且他申请的空间是连续的,但是他的大小是有限的,只适合一小的变量
- 下面的就是堆,他是从低地址向高地址向低地址延深的,他是由程序员手动申请和释放的,他的管理类似一条链表,所以他的空间是不连续,过于频繁的释放和申请栈区变量,会产生大量的空间碎片,而导致程序运行缓慢
- 之后常量区(全部变量区),他会伴随着程序结束才会被释放
- 常量储存区: 他存放的是不可被修改的常量,通常用在那些编译期间就能确定大小的区域,并且他在程序运行期间是可见的
- 代码段:存放的程序执行的代码,其中代码段和已经初始化的静态变量在可执行文件中,其实也放有一些常量