C语言存储管理之堆和栈的区别

C语言存储管理之堆和栈的区别,第1张

目录
  • 一、栈
  • 二、堆
  • 三、总结

一、栈

我们经常说的数据结构堆栈,其实指的就是栈,它是一种先进后出的数据结构,从管理角度来讲,它是由 *** 作系统自动分配管理的,也就是说它是规整的,内存的大小在申请之后不会发生变化。因此,它不会出现碎片化,并且读取速度非常的快。什么样的数据存放到栈里面呢?我们经常声明的局部变量,一些基本数据类型,比如int,double,short,char等,这些数据在声明的时候,内存的大小已经确定,它们会被存放到栈中。使用栈的好处是,不需要程序员管理内存的释放,这些内存会由 *** 作系统自动释放,比如我们运行的一些函数,当函数结束的时候,它内部的变量申请的内存空间就会被自动释放。

二、堆

相比于栈的固定大小,堆的分配非常自由,它是由程序员自己去分配的,比如程序员考虑到某些情况需要更多的内存,它就可以在堆上面申请一个足够大的内存。除此之外,内存的分配非常自由,它并不要求是连续的内存,只要有空间,都可以被拿来分配。不过这样就会导致产生很多碎片,不利于高速读取,因此堆的 *** 作的速度要比栈慢很多。堆主要存放的是大小不固定的内存结构,因此,我们的数组和结构体经常被存放到堆上。对于全局变量我们也会放到堆上,因为它需要可以被任何地方访问,并且不能像栈一样被 *** 作系统回收


三、总结(堆栈的主要区别)

1、管理方式不同:
堆是存储的单位,栈是运行时的单位。


2、空间大小不同:
栈是向低地址扩展的数据结构,是一块连续的内存;
堆是向高地址扩展的数据结构,是一块不连续的内存。


3、是否产生碎片:
栈内存的大小在申请之后不会发生变化。因此,它不会出现碎片化;
堆内存由于频繁使用malloc/free,造成了内存的不连续,产生了大量的碎片。


4、增长方向不同:
堆的增长方向是向上的,即向内存地址增加的方向;
栈的增长方向是向下的,即向内存地址减小的方向。


5、分配方法不同:
堆内的资源一般由程序员分配释放;
栈内的资源由 *** 作系统自动分配释放。


6、分配效率不同:
栈是系统提供的数据结构,计算机分配有专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行;
堆是C库函数提供的,它的机制比较复杂,比如为了分配一段内存,库函数会在堆内存搜索可用的足够大的空间,如果没有足够大的空间(由于内存碎片太多),就需要 *** 作系统重新整理内存,得到足够大的内存后再返回。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498643.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存