前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?

存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?

作者头像
哆哆jarvis
发布2022-08-23 14:03:51
1K0
发布2022-08-23 14:03:51
举报
文章被收录于专栏:嵌入式进阶之路

1、堆

在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。

在C程序中,我们用malloc和free函数来从堆中动态地分配和释放内存。

这里需要提醒基础不好的同学,

第九行,*p打印出p的值对应的存储单元的数据;

如果是p,则打印p的值(是个地址,指针变量存放的值是个地址)。

这个值每次打印都不一样。

2.栈

栈是用来存放局部变量、函数的参数以及调用函数和被调用函数的联系的内存池。它是一种先进后出的压入弹出式的数据结构。栈内存由编译器在需要的时候自动分配,在不需要的时候自动销毁的变量。

3.free函数的重要性

静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非用 free()进行释放。内存不进行释放,会造成内存泄漏,甚至可能会导致系统崩溃。

free函数的用处在于实时地执行回收内存的操作,如果程序很简单,程序结束之前也不会使用过多的内存,不会降低系统的性能,那么也可以不用写free函数去释放内存。程序结束之后,操作系统会完成释放功能。

但是在开发大型程序时如果不写free函数去释放内存,后果是很严重的。如果程序要重复10000次10MB的内存分配,如果每次用完都释放,那程序只需要10MB就行了,但是如果不适用free函数释放,那么程序就要使用100G内存。这其中包括绝大部分的虚拟内存,而由于虚拟内存的操作需要读写磁盘,这会极大地影响系统性能,系统可能因此崩溃。

总结

存储类别和动态内存分配有何联系?我们来看一个理想化模型。可以认为程序把它可用的内存分为3部分:一部分供具有外部链接、内部链接和无链接的静态变量(static)使用;一部分供自动变量使用;一部分供动态内存分配。

静态存储类别所用的内存数量在编译时确定,只要程序还在运行,就可访问储存在该部分的数据。该类别的变量在程序开始执行时被创建,在程序结束时被销毁。

然而,自动存储类别的变量在程序进入变量定义所在块时存在,在程序离开块时消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也相应地增加和减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁。

动态分配的内存在调用 malloc()或相关函数时存在,在调用 free()后释放。这部分的内存由程序员管理,而不是一套规则。所以内存块可以在一个函数中创建,在另一个函数中销毁。正是因为这样,这部分的内存用于动态内存分配会支离破碎。也就是说,未使用的内存块分散在已使用的内存块之间。另外,使用动态内存通常比使用栈内存慢。总而言之,程序把静态对象、自动对象和动态分配的对象储存在不同的区域。

本期的内容结束~主要介绍了存储类别、内存管理。

如果发现文中有错误,欢迎到后台留言,感谢~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆jarvis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档