人评论 来源:独
酌逸醉
分享到:更多
欢迎分享开发问题到码农社区!将问题帖子私信@ 程序员俱乐部 ,将有近 60000 人为您
解答!
问题描述
编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质
上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意
思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角
度上看)?
在通常情况下由操作系统()和语言的运行时()控制吗?
它们的作用范围是什么?
它们的大小由什么决定?
哪个更快?
答案一
栈是为执行线程留出的内存空间。当函数被调用的时候,栈顶为局部变量和一些
数据预留块。当函数执行完毕,块就没有用了,可能在下次的函数调用的
时候再被使用。栈通常用后进先出()的方式预留空间;因此最近的保留块
( !)通常最先被释放。这么做可以使跟踪堆栈变的简单;从栈中释放块
(" !)只不过是指针的偏移而已。
堆(#$)是为动态分配预留的内存空间。和栈不一样,从堆上分配和重新分配块没有固
定模式;你可以在任何时候分配和释放它。这样使得跟踪哪部分堆已经被分配和被释放变
的异常复杂;有许多定制的堆分配策略用来为不同的使用模式下调整堆的性能。
每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆(尽管为不同类型分配内
存使用多个堆的情况也是有的)。
直接回答你的问题: 当线程创建的时候,操作系统()为每一个系统级(%
)的线程分配栈。通常情况下,操作系统通过调用语言的运行时()去为应
用程序分配堆。 栈附属于线程,因此当线程结束时栈被回收。堆通常通过运行时在应
用程序启动时被分配,当应用程序(进程)退出时被回收。 当线程被创建的时候,设
置栈的大小。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候扩展(分配
器向操作系统申请更多的内存)。 栈比堆要快,因为它存取模式使它可以轻松的分配
和重新分配内存(指针&整型只是进行简单的递增或者递减运算),然而堆在分配和释放的
时候有更多的复杂的 参与。另外,在栈上的每个字节频繁的被复用也就意
味着它可能映射到处理器缓存中,所以很快(译者注:局部性原理)。