堆和栈的区别?
一、什么是堆内存?
堆是在程序运行时申请的内存空间,即动态分配的内存。对堆内存访问和对一般内存的访问没有区别。一般由用户申请和释放,若用户没有释放,程序结束时可能由操作系统回收。
二、什么是栈内存?
栈内存是为线程留出的临时空间,每个线程都有一个固定大小的栈空间,而且栈空间存储的数据只能由当前线程访问,所以它是线程安全的。栈内存由操作系统自动分配和释放,存放函数的形参、局部变量等,其操作方式类似于数据结构中的栈(先进后出)。
三、堆和栈的区别
1、申请过程
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找名列前茅个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的 free 语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放回空闲链表中。
2、申请大小的限制
栈空间容量有限,不同的操作系统有2M、4M、8M。
堆空间因为是不连续的内存,所以空间非常大,取决于虚拟内存的大小。
3、申请的效率
栈空间由系统管理,申请速度很快。
堆空间过程繁琐,使用起来比较慢。
4、存放的数据不同
栈空间存放函数形参和局部变量,并且形参按照从右到左的顺序依次进入栈内存,最后是局部变量。
堆内存的内容由程序员自己决定。
以上就是关于堆和栈堆知识希望对大家有帮助。

相关推荐HOT
更多>>
Cmd指令和JAVA编程语言有什么区别?
一、Cmd指令和JAVA编程语言的区别CMD指令和Java编程语言是两个不同的概念,它们的区别是:1、用途不同CMD指令是命令行界面下的命令指令,用于操...详情>>
2023-10-18 23:58:30
软件层和应用层有哪些区别?
一、软件层和应用层的区别在计算机网络中,软件层和应用层是两个不同的概念,它们具有明显的区别。1、定义不同软件层(Software Layer)是指把...详情>>
2023-10-18 19:53:05
hold和host的区别?
一、hold和host的区别hold 表示举行举办的时候,是sb hold sth例如: I hold a meeting。host 作动词表示举行,比如I host a party但是host有带...详情>>
2023-10-18 19:31:56
研发管理体系,如何挑选哪种更适合?
一、研发管理体系1. 基于CMMI的研发体系CMMI能力成熟度模型相信大家都不陌生,从一级到五级,覆盖了22个过程域,一般能达到CMMI3级别的基本上可...详情>>
2023-10-18 16:42:32