C++:4.0 混淆概念(1)堆和栈
1、堆和栈分为:
1) 数据结构中的堆、栈;
堆:类似于一个完全二叉树
栈:后进先出
队列:先进先出
2) 内存使用中的堆、栈;(即:堆区 和 栈区)
栈区(stack):由编译器自动分配释放,存储函数的参数值、局部变量的值等;
堆区(heap):由程序员分配释放,若程序员不释放,程序结束时可能由系统回收,也是C++内存溢出的原因之一
申请效率:
栈由系统自动分配,速度较快,但程序员无法控制;
堆通过new分配,一般速度较慢,但用起来很方便;
2、针对内存使用中的堆区和栈区的空间分配:
C/C++中占用的内存分为五个部分:栈区、堆区、全局区(静态区)、文字常量区、程序代码区。
-- 栈区:编译器自动分配释放,存放函数的参数值,局部变量的值等。
-- 堆区:由程序员分配释放,若程序员不释放,则当程序结束时由OS回收。
-- 全局区(静态区):全局变量和静态变量的存储放在一起。
初始化的全局变量和静态变量在一块区域;
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
-- 文字常量区:存放常量字符串,程序结束后由系统释放。
-- 程序代码区:存放函数体的二进制代码。
# include<iostream.h>
# include<string.h>
# include<stdlib.h>
1 int a = 0; // 全局区:全局初始化区 2 char *p1; // 全局区:全局未初始化区 3 4 void main() 5 { 6 int b; // 栈区 7 char s[] = "abc"; // 栈区 8 char *p2; // 栈区 9 char *p3 = "123456"; // 123456在常量区, p3在栈区 10 static int c = 0; // 全局(静态)初始化区 11 p1 = (char *)malloc(10); 12 p2 = (char *)malloc(20); // 程序员分配,堆区 13 }
3、针对数据结构中的堆和栈:(+队列)
1)堆:
堆 是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指二叉树。
堆通常有如下两个性质:
(1)堆是一棵完全二叉树;
(2)堆中子节点的值总是不大于其父节点的值,或者总是小于其父节点的值;
堆分为大根堆(最大堆)和小根堆(最小堆);
大根堆指父节点中的元素一定比子节点的元素要大
小根堆指父节点中的元素一定比子节点的元素要小
2)栈:(后进先出)
栈 是仅能在表尾进行插入和删除操作的线性表。
允许插入和删除的一端成为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。
栈中定义了两个操作:PUSH和POP
PUSH操作在堆栈顶加入元素;POP操作在堆栈顶移去元素,且堆栈大小减一。
3)队列:(先进先出)
队列 只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
允许插入的一端称为队尾,允许删除的一端称为对头。
参考:
https://blog.csdn.net/u012351051/article/details/80821400
https://www.jianshu.com/p/5f148c3e4f7d
https://blog.csdn.net/qq_38089394/article/details/70838033