首页 > 试题广场 >

简述一下堆和栈的区别

[问答题]

简述一下堆和栈的区别

推荐

得分点

管理方式、空间大小、是否产生内存碎片、生长方向、分配方式、分配效率

参考答案

标准回答

堆和栈主要有如下几点区别:管理方式、空间大小、是否产生内存碎片、生长方向、分配方式、分配效率。

  1. 管理方式

    对于栈来讲,是由编译器自动管理,无需手动控制;对于堆来说,分配和释放都是由程序员控制的。

  2. 空间大小

    总体来说,栈的空间是要小于堆的。堆内存几乎是没有什么限制的;但是对于栈来讲,一般是有一定的空间大小的。

  3. 碎片问题

    对于堆来讲,由于分配和释放是由程序员控制的(利用new/delete 或 malloc/free),频繁的操作势必会造成内存空间的不连续,从而造成大量的内存碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的数据结构,在某一数据弹出之前,它之前的所有数据都已经弹出。

  4. 生长方向

    对于堆来讲,生长方向是向上的,也就是沿着内存地址增加的方向,对于栈来讲,它的生长方式是向下的,也就是沿着内存地址减小的方向增长。

  5. 分配方式

    堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配;动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器实现的,无需我们手工实现。

  6. 分配效率

    栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率很高。堆则是 C/C++ 函数提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率要比栈底的多。

编辑于 2021-09-15 11:11:11 回复(0)
一、堆栈空间分配区别:
    1、栈(操作系统):由操作系统自动分配释放 
,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
    2、堆(操作系统): 一般由程序员分配释放, 
若程序员不释放,程序结束时可能由os回收,分配方式倒是类似于链表。
    二、堆栈缓存方式区别:
    1、栈使用的是一级缓存, 
他们通常都是被调用时处于存储空间中,调用完毕立即释放;
    2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
    三、堆栈数据结构区别:
    堆(数据结构):堆可以被看成是一棵树,如:堆排序;
    栈(数据结构):一种先进后出的数据结构。
发表于 2022-02-09 17:37:50 回复(0)