栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

一、栈

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

二、堆

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


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

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


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


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


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


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


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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976637.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号