数据结构中描述堆栈:
堆(heap):是一种非连续的树形存储数据结构,每个节点存在一个值,整个树是经过排序的,特点是根节点最小(小顶堆)或根节点最大(大顶堆),且根节点的两个子树也是一个堆。常用来实现优先队列,存取随意。
栈(stack):是一种连续存储的数据结构,具有先进后出的性质。通常的操作有入栈(压栈),出栈和栈顶元素。想要读取某个元素就要将之前的元素全部出栈,才能完成。
内存中的栈区与堆区:
内存:计算机中的随机存储器(RAM),程序都在这里运行。
栈内存:编译器自动分配和释放,存放函数的参数,局部变量,临时变量等等。
堆内存:为成员分配和释放,由程序员自己申请,自己释放。如果没有手动释放,再程序结束时由操作系统自动回收,稍有不慎会发生内存泄漏,典型为使用new申请堆内存
申请内存后的反应:
栈:只要栈的剩余空间爱你大于所申请的空间爱你,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:在记录空闲内存地址的链表中寻找一个控件大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的控件分配给程序。另外,对于大多数系统会再这块内存空间的收低值出记录本次分配空间的大小,这样代码中的delete才能正确释放本内存控件。系统会将多余的那本分重新分配到空闲链表中。
申请大小限制:
栈:
在Windows下,栈的是从低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思时栈顶的地址和栈的最大容量时系统预先规定好的,在Windows 下,栈的大小时2M,(也有的说是1M,总之是一个编译时就确定的常熟),如果申请的控件超多乐栈的剩余空间就会提示overflow(栈溢出)。因此,能从栈获得的控件较小。
堆:
堆是向高低值扩展的数据结构,是不连续的内存区域。这是由于系统时用链表来存储的空闲内存地址的,自然是不连接的,而链表的便利方向时从低地址向高地址。堆的大小受限与计算机系统中有效的虚拟内存。由此可见,堆获得的空间灵活,也比较大。
分配效率:
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:由new分配的内存,一般速度比较慢,而且人哦改一产生内存碎片,不过同期来最方便。另外,在Windows下最好的方式时用VirtualAlloc分配内存,不是在堆,也不是再栈直接再进程的地址控件中不留一块内存,用起来最不方便,但是速度快,也是最灵活。
存储内容:
栈:在栈中,第一个进栈的时主函数下一条指令的地址,然后时函数的各个参数,在大多数编译器中,参数时由右往左入栈,然后时函数中的局部比那两。注意,静态变量不入栈(进入静态存储区)。出栈的顺序相反。
堆:一般在堆的头部用一个字节存放堆的大小,具体内容由程序员安排。