data-structures - 栈和堆是什么以及在哪里?

标签 data-structures memory-management stack heap-memory dynamic-memory-allocation

  • 什么是栈和堆?
  • 它们在计算机内存中的物理位置是什么?
  • 它们在多大程度上受操作系统或语言运行时的控制?
  • 它们的范围是什么?
  • 什么决定了它们的大小?
  • 是什么让一个人更快?

最佳答案

堆栈是为执行线程留出的临时空间。当调用函数时,会在堆栈顶部保留一个 block 用于局部变量和一些簿记数据。当该函数返回时,该 block 将变为未使用状态,并且可以在下次调用函数时使用。堆栈始终按照 LIFO(后进先出)顺序保留;最近保留的 block 始终是下一个要释放的 block 。这使得跟踪堆栈变得非常简单;从堆栈中释放一个 block 只不过是调整一个指针。

堆是为动态分配预留的内存。与堆栈不同,堆中 block 的分配和释放没有强制模式;您可以随时分配 block 并随时释放它。这使得在任何给定时间跟踪堆的哪些部分已分配或空闲变得更加复杂;有许多自定义堆分配器可用于调整不同使用模式的堆性能。

每个线程都有一个堆栈,而应用程序通常只有一个堆(尽管对于不同类型的分配有多个堆并不罕见)。

直接回答您的问题:

To what extent are they controlled by the OS or language runtime?

操作系统在创建线程时为每个系统级线程分配堆栈。通常,操作系统由语言运行时调用来为应用程序分配堆。

What is their scope?

堆栈附加到线程,因此当线程退出时,堆栈将被回收。堆通常在应用程序启动时由运行时分配,并在应用程序(技术上的进程)退出时回收。

What determines the size of each of them?

堆栈的大小是在创建线程时设置的。堆的大小是在应用程序启动时设置的,但可以随着空间的需要而增长(分配器从操作系统请求更多内存)。

What makes one faster?

堆栈速度更快,因为访问模式使得从中分配和释放内存变得很简单(指针/整数只是递增或递减),而堆在分配或释放时涉及更复杂的簿记。此外,堆栈中的每个字节往往会非常频繁地重用,这意味着它往往会被映射到处理器的缓存,从而使其速度非常快。对堆的另一个性能影响是,堆主要是全局资源,通常必须是多线程安全的,即每次分配和释放都需要(通常)与程序中的“所有”其他堆访问同步。/p>

清晰的演示:
图片来源:vikashazrati.wordpress.com

关于data-structures - 栈和堆是什么以及在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/79923/

相关文章:

data-structures - 如何在 GHC 中编写尽可能高效的数据结构?

iphone - 一个有 2 个所有者的对象

.net - System.Drawing 和垃圾收集

python - 在 Python 中使用堆栈计算中缀表达式 : I cant find my error

java - 将字典文本文件加载到 Java 中

C++画一棵树

有人可以改进我的堆数据结构代码吗?

c++ - 将内存池中的malloc和free替换为new和delete

c++ - 我应该使用 map 、3D 数组还是坚持使用堆栈?

c++ - 带有大量 SC_THREAD 的 Accellera SystemC 错误