你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言栈和堆几个方面的不同

[复制链接]
gaosmile 发布时间:2020-6-19 11:07
对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等,初学开发过程中往往让人混淆不清。

对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等,初学开发过程中往往让人混淆不清。今天我们来谈谈堆和栈的具体区别,来帮助初学者理清思路。

堆和栈的区别一直都是永恒的话题,为此我也查了很多的资料,以防自己的理解错误,而给他人造成理解偏差。

先从简单的一个例子引出堆和栈:

void function(){
 int *p = (int *)malloc(10*sizeof(int));
}
  
这是C语言开发学习过程中,必不可免要学习的知识,动态分配一块空间,空间在堆区大小是40字节(32位系统中)。而定义的指针变量p是局部变量(在栈区中 占用4字节空间),用来存放刚刚前面动态分配的空间的首地址。可以看出,在这一句代码中同时包含了栈和堆,如图所示。

微信图片_20200619110653.png   
我们从以下几个方面比较一下堆和栈:  
1 存储内容不同

栈:在函数调用时,栈中存放的是函数中(底下是函数调用后的下一条指令)各个参数(局部变量)。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。  
2 管理方式上不同

栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。

堆:需要程序员手动申请并且手动释放,并指明大小,在C语言中malloc函数申请,释放free函数,在C++中 new和delete实现。  
3 空间大小不同

栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。
  堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。  
4 能否产生碎片不同

栈:不会产生碎片,空间连续。

堆:采用的是链表的存储方式,会产生碎片。  
5 生长方向不同

栈:向低地址扩展的数据结构,是一块连续的内存的区域。
  堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。  
6 分配方式不同

栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。
  堆:都是动态分配的,没有静态分配的堆。  
7 分配效率不同

栈:由系统自动分配,速度较快。但程序员是无法控制的。
  堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。  以上是栈和堆几个方面的不同,希望通过上面的资料可以帮助初学者分清堆和栈。
收藏 评论1 发布时间:2020-6-19 11:07

举报

1个回答
mmuuss586 回答时间:2020-6-19 11:33:42
感谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版