c语言中栈和堆的区别(C之堆与栈)
堆与栈,我来为大家科普一下关于c语言中栈和堆的区别?以下内容希望对你有帮助!
c语言中栈和堆的区别
堆与栈
堆与栈都是内存空间的一部分,堆分为托管堆和非托管堆,托管堆由CLR管理,对非托管堆的管理则由开发者完成。
堆
托管堆是运行程序时,CLR申请的一块内存空间。
当创建新对象时,如果对象是引用类型或者包括引用类型的值类型,就会在GC堆上申请空闲的内存空间,CLR先计算需要的空间大小,如果堆上没有剩余空间了,就触发一次垃圾回收,如果回收后仍旧没有足够的内存空间,就抛出OutOfMemory异常。
为了合理利用空间,GC堆内存分配是连续的,垃圾回收结束,部分空间被释放,会有内存碎片,此时进行压缩,将内存重新变为连续状态。
非托管资源占用另一部分的内存,叫做本地堆或者非托管堆。CLR不负责这一块的垃圾回收,常见的非托管资源有文件流、数据库连接、打印机资源等。
栈
是一个先进后出的栈数据结构,所以一直是连续的。栈中的对象离开了定义域就会自动销毁,所以栈一般空间是够用的。爆栈也有例子,比如一个没有出口的递归,此时所有的变量都还在它们的定义域中。
对于引用类型,也会使用栈,但栈只是存储一个地址,即引用,就是它在堆上的内存地址,通过访问栈上的地址就可以间接访问到堆上的引用类型对象以及他们的值。
由于栈只能从顶部放入或者拿走数据,所以内存总是连续的,不需要进行GC。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com