1、数据结构中的堆和栈
栈:是限定仅在表尾进行插入删除操作的线性表。先进后出。
堆:堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意。
2、C++内存中的堆和栈
2.1、程序内存分配
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap) — 一般由程序员分配释放或自动释放。它与数据结构中的堆是两回事。
3、全局区(静态区)(static)—其不在栈中也不在堆中。
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
2.2、堆和栈的区别
-
堆是存储的单位,栈是运行时的单位
-
堆负责数据,栈负责处理逻辑【分而治之的思想,使得处理逻辑更加清晰】
-
堆中的对象可以根据需要动态增长,栈的大小固定【但二者如此处理,相得益彰】
-
堆中存放的是对象,栈中存放的是基本数据类型和堆中对象的引用【因为基本数据类型的长度固定、生命周期固定】
-
堆内的资源一般由程序员分配释放,若不释放可能由OS回收,分配方式类似于链表 栈内的资源由操作系统自动分配释放
-
堆和栈就是面向对象的完美结合【对象的属性就是数据》放在堆中 对象的行为就是方法》放在栈中】
-
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
3、堆和栈的工作原理
比较难懂,尽力而为。