对于编程初学者来说,会接触到一些难以理解的名字,比如堆(heap)、栈(stack)、栈(stack)等,在初学者的开发过程中往往会让人一头雾水。 今天我们就来说说堆和栈的具体区别,帮助初学者理清思路。
堆和栈的区别一直是一个永恒的话题。 为此,我也查了很多资料,防止自己的理解有误,给别人造成理解上的偏差。
我们先从一个简单的例子来介绍一下堆和栈:
无效函数(){
int *p = (int *)malloc(10*sizeof(int));
}
堆和栈
我们从以下几个方面比较堆和栈:
1个
存储内容不同
栈:调用函数时,函数中的每个参数(局部变量)(函数调用后的下一条指令)都存放在栈中。
堆:一般在堆的头部用一个字节存储堆的大小。 堆中的具体内容由程序员安排。
2个
管理不同
Stack:系统自动分配空间,系统自动释放空间。 比如在函数中声明一个局部变量int b; 系统自动在栈中为b创建空间,栈空间在对应的生命周期结束时自动释放。
Heap:需要程序员手动申请和释放,并指定大小,C语言申请malloc函数,release free函数,C++实现new和delete。
3个
不同尺寸
堆栈:获得更少的空间。 Windows下,一般大小为1M或2M。 当剩余栈空间不足时,分配失败溢出。
Heap:获取的空间与系统的有效虚拟内存有关c语言堆和栈的区别,比较灵活c语言堆和栈的区别,较大。
4个
片段可以不同地产生吗
栈:无碎片,空间连续。
堆:采用链表的存储方式,会产生碎片。
5个
不同的成长方向
栈:向低地址扩展的数据结构,是一块连续的内存区域。
堆:向高地址扩展的数据结构,是一个不连续的内存区域。 这是因为系统使用链表来存储空闲内存地址,这些地址自然是不连续的,而链表的遍历方向是从低地址到高地址。
6个
分配不同
Stack:有2种分配方式:静态分配和动态分配。 static是由编译器完成的,比如局部变量; dynamic由alloca函数实现,编译器会释放。
堆:都是动态分配的,没有静态分配的堆。
7
分配效率不同
Stack:由系统自动分配,速度更快。 但是程序员失控了。
堆:new分配的内存一般比较慢,容易产生内存碎片,但是使用方便。
以上就是栈和堆几个方面的区别。 希望以上信息可以帮助初学者区分堆和栈。
扫码入群
扫码添加管理员微信
加入《电子产品大世界》粉丝交流群