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++库函数提供的,效率较低。计算机底层对栈提供支持,分配专门的寄存器存放栈的地址,有专门的机器指令负责压栈出栈,效率更高。

  • 相关阅读:
    数据库——大事务
    数据库——性能理解
    java——通过GenericObjectPool获取到的资源,调用close()方法会close还是returnObject?
    gradle——入门
    MongoDB——morphia
    jvm——Java main方法的执行
    sql——limit
    阿里云Open API自动化脚本—ECS公网IP转化弹性公网IP
    阿里云共享带宽
    mysql5.x安装脚本
  • 原文地址:https://www.cnblogs.com/LifeoFHanLiu/p/9965292.html
Copyright © 2011-2022 走看看