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

    现在的计算机面试题中大多都会问到堆和栈的区别,下面仔细讲讲两者的六大区别:
    1.管理方式不同
    堆是由程序员通过 调用系统库函数来管理内存,所以管理不力 就会出现常说的内存泄漏
    栈是由计算机系统分配内存 而且系统有专门的寄存器存储栈指针。
    2.生长方式不同
    堆是向高地址扩展 也就是常说的向上生长。是不连续的内存区域。
    栈是向低地址扩展 也就是常说的向下生长。 是连续的内存区域。
    (我 本人是这么理解的。因为堆是人为分配地址 所以分配的地址大小往往比实际需要的内存大,所以是不连续的内存区域。而对于栈而言 ,系统有分配专门的寄存器存放栈地址,压栈出栈由专门的指令(先进后出FILO)执行,所以是连续的内存区域。如果理解不对,还望指出。)
    3.空间大小不同
    堆的大小 可以高达 4G 在32位Linux里系统有效的虚拟内存也有3.2G
    栈的大小 一般是 1M ~10M 不等(和堆相差很多)。
    4.内存速率不同
    栈的内存速率较快。前面说了 栈是系统分配内存 ,而且有这FILO的出栈顺序 所以栈的内存速率快些。
    堆 因为是程序员分配内存 ,而且是由C/C++函数库提供的。而且机制比较复杂,为了找打到一块合适大小的内存区域 会挨个遍历。所以耗时也就比较多些。
    5.存储内容不同
    栈在函数调用时,首先压入主调函数中下条指令(函数调用语句的下条可执行语句)的地址,然后是函数实参,然后是被调函数的局部变量。本次调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的指令地址,程序由该点继续运行下条可执行语句。
    堆通常在头部用一个字节存放其大小,堆用于存储生存期与函数调用无关的数据,具体内容由程序员安排。
    (其实我自己的理解是栈有自己的出栈方式FILO 所以局部调用结束后就直接出栈了,然后进行其他没出栈的操作处理。而堆是先存需要的内存大小,然后后面的就交给创建者自己处理了)
    6.分配方式不同
    栈可静态分配或动态分配。静态分配由编译器完成,如局部变量的分配。动态分配由alloca函数在栈上申请空间,用完后自动释放。
    堆只能动态分配且手工释放。(堆就好比OC语言里的MRC,而OC里的ARC就是苹果帮我们处理的MRC)
    本文中的()部分只作为帮助理解, 不作为正确的区别答案。如果想要深入了解堆栈。推荐看下《计算机原理》和《数据结构》这两本教材
  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/lovemargin/p/10533691.html
Copyright © 2011-2022 走看看