C++中,内存分为5个区:堆、栈、全局/静态存储区、常量存储区和程序代码区。
1、栈区(stack)—— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) —— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒 是类似于链表。
3、全局区(静态区)(static)—— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量 和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —— 常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区 —— 存放函数体的二进制代码。
一、空间分配
栈:有操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式到时类似于链表。
二、缓存方式
栈:使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
堆:是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、数据结构
栈:一种先进后出的数据结构。
堆:堆可以被看成是一棵树,如:堆排序;
四、扩展
-
堆支持以下的基本:
(1)build:建立一个空堆;
(2)insert:向堆中插入一个新元素;
(3)update:将新元素提升使其符合堆的性质;
(4)get:获取当前堆顶元素的值;
(5)delete:删除堆顶元素;
(6)heapify:使删除堆顶元素的堆再次成为堆。
-
栈的基本算法
(1)进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
(2)退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。