堆和栈的区别
现在的计算机面试题中大多都会问到堆和栈的区别,下面仔细讲讲两者的六大区别:
1.管理方式不同
堆是由程序员通过 调用系统库函数来管理内存,所以管理不力 就会出现常说的内存泄漏
栈是由计算机系统分配内存 而且系统有专门的寄存器存储栈指针。
2.生长方式不同
堆是向高地址扩展 也就是常说的向上生长。是不连续的内存区域。
栈是向低地址扩展 也就是常说的向下生长。 是连续的内存区域。
(我 本人是这么理解的。因为堆是人为分配地址 所以分配的地址大小往往比实际需要的内存大,所以是不连续的内存区域。而对于栈而言 ,系统有分配专门的寄存器存放栈地址,压栈出栈由专门的指令(先进后出FILO)执行,所以是连续的内存区域。如果理解不对,还望指出。)
3.空间大小不同
堆的大小 可以高达 4G 在32位Linux里系统有效的虚拟内存也有3.2G
栈的大小 一般是 1M ~10M 不等(和堆相差很多)。
4.内存速率不同
栈的内存速率较快。前面说了 栈是系统分配内存 ,而且有这FILO的出栈顺序 所以栈的内存速率快些。
堆 因为是程序员分配内存 ,而且是由C/C++函数库提供的。而且机制比较复杂,为了找打到一块合适大小的内存区域 会挨个遍历。所以耗时也就比较多些。
5.存储内容不同
栈在函数调用时,首先压入主调函数中下条指令(函数调用语句的下条可执行语句)的地址,然后是函数实参,然后是被调函数的局部变量。本次调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的指令地址,程序由该点继续运行下条可执行语句。
堆通常在头部用一个字节存放其大小,堆用于存储生存期与函数调用无关的数据,具体内容由程序员安排。
(其实我自己的理解是栈有自己的出栈方式FILO 所以局部调用结束后就直接出栈了,然后进行其他没出栈的操作处理。而堆是先存需要的内存大小,然后后面的就交给创建者自己处理了)
6.分配方式不同
栈可静态分配或动态分配。静态分配由编译器完成,如局部变量的分配。动态分配由alloca函数在栈上申请空间,用完后自动释放。
堆只能动态分配且手工释放。(堆就好比OC语言里的MRC,而OC里的ARC就是苹果帮我们处理的MRC)
本文中的()部分只作为帮助理解, 不作为正确的区别答案。如果想要深入了解堆栈。推荐看下《计算机原理》和《数据结构》这两本教材
版权声明:本文为lovemargin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。