1.数据结构中的堆和栈
栈是一种先进后出的数据结构,是一种线性结构;堆是一种非线性结构,是有序的一般为大根堆或小根堆,堆的存取比较随意;
2.内存分配中的堆和栈
一般情况下程序是放在ROM或者Flash中的,运行时需要拷贝到内存中才可以执行,内存会分别存储不同的信息。接下来就详细介绍一下内存分配中堆和栈的区别。
(1)申请和回收方式:栈使是系统直接分配和回收的;堆是根据用户的需要自己申请的和释放的,因此可能忘记释放而会造成内存泄漏。由此可见一般的栈的生存周期小于堆的生存周期。
(2)申请时系统的响应:当运行时需要栈空间时,系统会自动判断需要的栈空间大小,如果需要的空间小于当前栈所剩余的空间,则直接分配,否则提示栈的空间不足,程序直接crash;堆是由程序控制申请的,当申请堆时,系统首先会查找记录空闲内存地址的表,当找到第一个大于等于申请空间的内存地址,就将该地址返回,并在首地址记录此次分配的大小,方便后续的释放。在找到的内存大于要申请的内存时,系统将需要的内存返回给用户,将多余的内存再次放回空闲内存表中。
(3)申请效率:栈是由系统控制的,操作速度较快,但程序员不可控;堆是可以有程序员控制的,申请时速度较栈的速度慢,但使用较为灵活,但是已造成内存的碎片化。
(4)大小限制:栈在windows是向低地址扩展的数据结构,是一块连续的内存区域,因此大小有限,一般为2M;堆在内存中是不连续的,地址扩展方向是向高地址增长的,使用空闲内存链表存储,大小受计算机的虚拟内存限制,因此堆的可用大小远远大于栈的大小
(5)存储内容的区别:栈中一般存储函数调用的相关信息(入口地址,参数和返回值);堆中除了头部用于存储堆的大小外,其余内容均有程序员决定。
(6)存取效率:栈上的数组存取速度比指针存取的速度快。
以上仅为自己知道的一些点,欢迎大家补充,如果有不正确的地方也请指出