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