Java教程

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

本文主要是介绍存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、堆

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

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

图片

图片

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

图片

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

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

图片

图片

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

图片

2.栈

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

3.free函数的重要性

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

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

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

总结

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

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

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

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

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

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

欢迎大家提出一切宝贵的建议~❤

最后厚着脸皮跟大家要个订阅~❤

这篇关于存储类别、链接和内存管理(三)--面试官有问你堆与栈吗?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!