首页 > 什么是堆和栈,它们在哪儿?

什么是堆和栈,它们在哪儿?

编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)?

在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗?
它们的作用范围是什么?
它们的大小由什么决定?
哪个更快?


抛砖引玉答一下:

图中在上面的为栈,下面为堆。

  1. 算是吧。。。操作系统通过分配内存的api分配堆上的空间,栈的大小变化则受程序当前运行情况的影响。
  2. 栈里放大小确定的变量,堆里放运行时分配的变量。比如int a = 3,int *p = (int *)malloc(42)中,a位于栈,p位于堆。
  3. 堆/栈大小取决于程序运行的情况。调用函数会进行压栈,就是所需的变量会占据新的栈空间,形成新的一帧,就是一块栈空间(包括这个调用中的参数,局部变量等等)。函数结束时,会返回到调用时的地址,函数执行所用的栈空间可能会另作他用。堆大小取决于程序要求分配的空间的大小。
  4. 应该差不多,取决于操作系统和硬件实现等等因数,不能武断下定义。

修订:看,真的抛砖引玉了耶 o(╯□╰)o
看评论里的http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap
还有对应的翻译哦
http://www.perfect-is-shit.com/what-and-where-are-the-stack-and-heap.html

【热门文章】
【热门文章】