随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

堆和栈的区别主要有五大点:    

1)申请方式不同:栈由系统自动分配,而堆是人为申请开辟的;

2)申请大小不同:栈获得的空间较小,而堆获得的空间较大;

3)申请效率的不同:栈由系统自动分配,速度较快,而堆一般速度比较慢;

4)存储内容的不同:栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数各个参数进栈,其中静态变量是不进栈的,而堆中一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排的;

5)底层不同,栈是连续的空间,而堆是不连续的空间。

 1、栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  

2、堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。  

区别:  

1. 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存溢出。  

2. 空间大小:堆内存几乎是没有什么限制。栈一般都是有一定的空间大小。 

3. 碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。  

4. 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。  

5. 分配效率:栈的效率比较高。堆的效率比栈要低得多。

6. 增长方向:堆的增长方向是从程序低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况可能不是这样的,与CPU的体系结构有关) 注意:这里的堆和数据结构中的堆没啥关系。

 

堆:自己做菜自己吃,什么时候收盘子自己知道,但是可能会浪费(产生碎片),因为可能自己一个人吃不完。 桟:公司食堂,你吃饭由食堂工作人员帮你打饭和分配位置,吃完了工作人员帮你收盘子。你浪费粮食(碎片)那是不可能的,因为食堂会把碎片拿去喂猪。

posted on 2023-03-15 10:47  时间完全不够用啊  阅读(147)  评论(0编辑  收藏  举报