zoukankan      html  css  js  c++  java
  • 堆和栈的区别

    1.管理方式不同

    2.生长方向不同

    3.大小不同

    4.能否产生碎片不同

    5.分配方式不同

    6.分配效率不同

    1)管理方式:堆,是由程序员进行管理的,需要程序员手动申请和回收空间,如果不回收的话,会造成内存泄漏的问题;栈,是由编译器进行管理的,由编译器自动分配和回收空间,一般保存的是局部变量和函数参数等。

    2)生长方向:堆是由低地址向高地址生长,而栈是由高地址向低地址生长。

    3)大小:堆的大小理论上大概等于进程虚拟空间大小-内核虚拟内存大小。Linux下,进程的高位1G留给内核,低位3G留给用户,所以进程堆大小小于3G。 Linux下进程栈的默认大小是10M,可以通过 ulimit -s查看并修改默认栈大小。

    4)产生碎片:堆的实现方式类似于链表,频繁的new/delete势必会造成空闲内存空间不连续,从而产生内存碎片。而栈不会产生内存碎片,因为栈是一种先入后出的数据结构,不可能有一个内存块从栈中间弹出。

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

    6)分配效率:堆是C/C++库函数提供的,效率较低。计算机底层对栈提供支持,分配专门的寄存器存放栈的地址,有专门的机器指令负责压栈出栈,效率更高。

  • 相关阅读:
    浮窗显示到毫秒时间的小工具 各大电商平台的时间
    非常不错的电脑截图软件介绍—截图加贴图。
    ​Everything 文件搜索神器 基于名称实时定位文件和目录
    THUPC2021初赛 & ICPC上海站游记
    旧题重做
    常用思想方法——数学期望篇
    vim 常用操作技巧
    生物制图软件——CirCos在Linux服务器上安装步骤:
    vue-element-admin 改造
    vue
  • 原文地址:https://www.cnblogs.com/LifeoFHanLiu/p/9965292.html
Copyright © 2011-2022 走看看