- 一、栈
- 二、堆
- 三、总结
一、栈
我们经常说的数据结构堆栈,其实指的就是栈,它是一种先进后出的数据结构,从管理角度来讲,它是由 *** 作系统自动分配管理的,也就是说它是规整的,内存的大小在申请之后不会发生变化。因此,它不会出现碎片化,并且读取速度非常的快。什么样的数据存放到栈里面呢?我们经常声明的局部变量,一些基本数据类型,比如int,double,short,char等,这些数据在声明的时候,内存的大小已经确定,它们会被存放到栈中。使用栈的好处是,不需要程序员管理内存的释放,这些内存会由 *** 作系统自动释放,比如我们运行的一些函数,当函数结束的时候,它内部的变量申请的内存空间就会被自动释放。
二、堆相比于栈的固定大小,堆的分配非常自由,它是由程序员自己去分配的,比如程序员考虑到某些情况需要更多的内存,它就可以在堆上面申请一个足够大的内存。除此之外,内存的分配非常自由,它并不要求是连续的内存,只要有空间,都可以被拿来分配。不过这样就会导致产生很多碎片,不利于高速读取,因此堆的 *** 作的速度要比栈慢很多。堆主要存放的是大小不固定的内存结构,因此,我们的数组和结构体经常被存放到堆上。对于全局变量我们也会放到堆上,因为它需要可以被任何地方访问,并且不能像栈一样被 *** 作系统回收
三、总结(堆栈的主要区别)
1、管理方式不同:
堆是存储的单位,栈是运行时的单位。
2、空间大小不同:
栈是向低地址扩展的数据结构,是一块连续的内存;
堆是向高地址扩展的数据结构,是一块不连续的内存。
3、是否产生碎片:
栈内存的大小在申请之后不会发生变化。因此,它不会出现碎片化;
堆内存由于频繁使用malloc/free,造成了内存的不连续,产生了大量的碎片。
4、增长方向不同:
堆的增长方向是向上的,即向内存地址增加的方向;
栈的增长方向是向下的,即向内存地址减小的方向。
5、分配方法不同:
堆内的资源一般由程序员分配释放;
栈内的资源由 *** 作系统自动分配释放。
6、分配效率不同:
栈是系统提供的数据结构,计算机分配有专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行;
堆是C库函数提供的,它的机制比较复杂,比如为了分配一段内存,库函数会在堆内存搜索可用的足够大的空间,如果没有足够大的空间(由于内存碎片太多),就需要 *** 作系统重新整理内存,得到足够大的内存后再返回。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)