存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?
2021/6/14 7:23:44
本文主要是介绍存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、堆
在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。
在C程序中,我们用malloc和free函数来从堆中动态地分配和释放内存。
这里需要提醒基础不好的同学,
第九行,*p打印出p的值对应的存储单元的数据;
如果是p,则打印p的值(是个地址,指针变量存放的值是个地址)。
这个值每次打印都不一样。
2.栈
栈是用来存放局部变量、函数的参数以及调用函数和被调用函数的联系的内存池。它是一种先进后出的压入弹出式的数据结构。栈内存由编译器在需要的时候自动分配,在不需要的时候自动销毁的变量。
3.free函数的重要性
静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非用 free()进行释放。内存不进行释放,会造成内存泄漏,甚至可能会导致系统崩溃。
free函数的用处在于实时地执行回收内存的操作,如果程序很简单,程序结束之前也不会使用过多的内存,不会降低系统的性能,那么也可以不用写free函数去释放内存。程序结束之后,操作系统会完成释放功能。
但是在开发大型程序时如果不写free函数去释放内存,后果是很严重的。如果程序要重复10000次10MB的内存分配,如果每次用完都释放,那程序只需要10MB就行了,但是如果不适用free函数释放,那么程序就要使用100G内存。这其中包括绝大部分的虚拟内存,而由于虚拟内存的操作需要读写磁盘,这会极大地影响系统性能,系统可能因此崩溃。
总结
存储类别和动态内存分配有何联系?我们来看一个理想化模型。可以认为程序把它可用的内存分为3部分:一部分供具有外部链接、内部链接和无链接的静态变量(static)使用;一部分供自动变量使用;一部分供动态内存分配。
静态存储类别所用的内存数量在编译时确定,只要程序还在运行,就可访问储存在该部分的数据。该类别的变量在程序开始执行时被创建,在程序结束时被销毁。
然而,自动存储类别的变量在程序进入变量定义所在块时存在,在程序离开块时消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也相应地增加和减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁。
动态分配的内存在调用 malloc()或相关函数时存在,在调用 free()后释放。这部分的内存由程序员管理,而不是一套规则。所以内存块可以在一个函数中创建,在另一个函数中销毁。正是因为这样,这部分的内存用于动态内存分配会支离破碎。也就是说,未使用的内存块分散在已使用的内存块之间。另外,使用动态内存通常比使用栈内存慢。总而言之,程序把静态对象、自动对象和动态分配的对象储存在不同的区域。
本期的内容结束~主要介绍了存储类别、内存管理。
如果发现文中有错误,欢迎到后台留言,感谢~
欢迎大家提出一切宝贵的建议~❤
最后厚着脸皮跟大家要个订阅~❤
这篇关于存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南