不管你是学习c语言,还是学习c++,亦或是学习java,你都会遇到内存分配的问题,而对于内存分配,它其实有两个地方,一个地方叫做堆,一个地方叫做栈,什么时候将数据存放到堆上面,什么时候将数据存放到栈上面,它们的区别是什么,今天我们就来详细讲解一下。
栈
我们经常说的数据结构堆栈,其实指的就是栈,它是一种先进后出的数据结构,从管理角度来讲,它是由操作系统分配管理的,也就是说它是规整的,内存的大小在申请之后不会发生变化。因此,它不会出现碎片化,并且读取速度非常的快。
什么样的数据存放到栈里面呢?我们经常声明的局部变量,一些基本数据类型,比如int,double,short,char等,这些数据在声明的时候,内存的大小已经确定,它们会被存放到栈中。使用栈的好处是,我们不需要管理内存的释放,这些内存会由操作系统自动释放,比如我们运行的一些函数,当我们函数结束的时候,它内部的变量申请的内存空间就会被自动释放,非常方便。
堆
相比于栈的固定大小,堆的分配非常自由,它是由程序员自己去分配的,比如程序员考虑到某些情况需要更多的内存,它就可以在堆上面申请一个足够大的内存。除此之外,内存的分配非常自由,它并不要求是连续的内存,只要有空间,都可以被拿来分配。不过这样就会导致产生很多碎片,不利于高速读取,因此堆的操作的速度要比栈慢很多。
堆主要存放的是大小不固定的内存结构,因此,我们的数组和结构体经常被存放到堆上。对于全局变量我们也会放到堆上,因为它需要可以被任何地方访问,并且不能像栈一样被操作系统回收。
总结
简单来讲,栈相当于吃自助,我们只需要拿自己喜欢的食物尽情享受就好,我们不需要刷盘子,不需要准备食材,我们唯一要做的就是选择自己要吃的食物即可。
而堆相当于我们在家自己做饭,我们需要自己准备食材,需要自己做菜,做完菜之后,我们还需要负责洗盘子,洗碗,这些就相当于堆的垃圾回收。
堆和栈说白了就是内存的两种管理方式,栈很规整,可以自己释放内存,但是不够灵活,堆很灵活,但是有时候我们又会嫌弃自己管理内存的麻烦。可以说两者各有利弊,我们应根据实际情况做出选择。