堆和栈的区别

Posted 随笔都是学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆和栈的区别相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

区别:  

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

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

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

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

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

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

 

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

以上是关于堆和栈的区别的主要内容,如果未能解决你的问题,请参考以下文章

值类型和引用类型的区别 I 数据结构中的堆和栈和内存中的堆和栈的区别

iOS中堆和栈的区别

堆和栈的区别:

堆和栈的区别 ?

堆和栈的区别

Java JVM里堆和栈的区别