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