一.前言
最近调试程序时发现关于内存中堆区和栈区方面的知识点有些模糊了,特意来整理记录一下,方便日后查阅;当然,开源的乐趣也要适当感受一下啦!话不多说,上图。
二.堆栈解说
首先,我们要先区分"数据结构中的堆栈
" 与 “内存中的堆栈
”;
数据结构中的堆栈,队列
在数据结构中,我认为堆栈就是数据存储方式的一种称呼罢了;
堆
:一个数据作为一个节点,那按堆的方式存储,就是一颗完全二叉树;
去混淆:这个“堆”没啥先进先出这个说法;
栈
:按栈的方式存起来,就是线性表,不过被限定只能在表尾进行增,删,改操作;
去混淆:这个“栈”又名堆栈,这叫法妥妥的让人懵啊,不过由于被限定原因,让采用栈存储的的对象拥有了“先进后出
”的属性;
队列
:按队列的方式存储数据,就是线性表,不过被限定只能在表头进行删除,表尾进行插入操作;
去混淆:这个队列也由于被限定原因,让采用队列存储的的对象拥有了“先进先出
”的属性;
内存中的堆栈
有上图所示,堆栈是内存中划分的一块存储区域,分别用于存储特定类型的数据;
顺路解释一下“为啥堆的内存地址增长方向是至下而上,而栈的是至上而下?”
答:因为在程序执行前,系统会为程序分配一块内存空间;加入堆区和栈区的增长方向都是至下而上的,那就要先固定栈的起始地址位置;这样就可能造成栈区用的内存区域太多不够用(栈溢出),而堆区用的少出现很多闲置区域的情况;或者可能造成栈区用的内存区域太少闲置,而堆区用的区域太多不够用(堆溢出)的问题;为了最大化的避免这种情况,才设计了堆栈相反的内存增长方向;
堆区
:
存储数据类型:堆区的数据一般是程序员申请和释放的(malloc,new; free,delete);
内存分配方式:类似于链表,逻辑内存连续,但物理内存不连续;
内存大小:空间相对较大;
存储速度:速度想对较慢(二级缓存);
存储方式:与数据结构中的堆类似;
栈区
:
存储数据类型:栈区的数据有系统自动分配释放,通常存放的是局部变量,函数的传递参数等(基本数据类型int , char…);
内存分配方式:类似于数组,系统会分配一块连续的物理内存;
内存大小:空间相对较小;
存储速度:速度想对较快(一级缓存);
存储方式:与数据结构中的栈类似,是一种“先进后出”的存储方式;
二.总结
算时对基础知识的梳理啦,学多了容易串戏,只能动动手指头记录一下了;
在用x32dbg进行调试时,可以关注一下ebp和esp这两个寄存器的地址,下次有时间总结一下”栈平衡“的相关内容吧。