堆和栈的区别

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

原文地址:https://www.cnblogs.com/LifeoFHanLiu/p/9965292.html