对堆栈和堆感到困惑?
认罪,我一直很难保持堆栈并分开。是的,我已经阅读了有关内存管理的信息,然后记住了分配的对象新的
继续堆。但是我不得不简短地考虑该位置是堆栈还是堆。有点像我必须考虑东西方。但是有什么分配意思?为什么它与堆栈有所不同?为什么还重要?
在Java或C#中,值类型(原始)存储在堆栈上,引用类型在堆上。根据堆栈和堆的记忆分配未指定C ++标准。相反,标准区分自动的和动态storage持续时间。本地变量具有自动存储持续时间,并且编译器将其存储在堆栈中。具有动态内存分配的对象(创建新的
)存储在免费商店中,通常称为堆。在未垃圾收集的语言中,如果没有释放,则堆上的对象会导致内存泄漏。
我们什么时候可以分配堆栈上的对象?一个重要的细节是存储对象的堆栈与运行时调用堆栈相同。由堆栈帧组成的运行时堆栈负责程序执行和函数调用。堆栈框架包含一个函数调用的所有数据:其参数,返回地址及其本地变量。堆栈分配的对象是这些局部变量的一部分。返回地址确定函数返回后执行的代码。
堆栈框架仅在函数的执行时间内存在,堆栈帧上的对象也存在。这具有一个优势,即我们不必担心由堆栈分配的对象引起的内存泄漏 - 但是一旦我们从函数返回,对象也不再可用。
只能在堆栈*上分配固定大小的对象。这样,我们就知道编译时堆栈框架的大小,并且可以在堆栈上使用固定偏移相对于堆栈指针访问对象。
我们什么时候可以分配堆上的对象?您可以将堆视为额外的存储,完全独立于运行时堆栈。它是没有特定布局的内存。独立于程序执行,我们可以在此堆中要求内存。当我们分配内存时,系统确保没有其他东西可以使用相同的内存并使我们的数据无效。堆上的对象在我们退出分配内存的功能后。这很好 - 但是现在,我们有责任在堆上释放内存,或者我们最终会出现内存泄漏。在垃圾收集的语言中,垃圾收集器在堆上释放内存并防止内存泄漏。
在内存管理的背景下,堆栈和堆一直是我的模糊概念。了解运行时堆栈最终使其单击。
当我阅读时,堆栈和堆变得清晰计算机系统:程序员的观点(第三版)。现在似乎很明显,但是一旦您理解了某些东西,总是很明显。
这本书有几章有关程序的机器级代表。这些章节是关于装配代码的。一个小节运行时间堆栈。
该部分说明了功能之间的传递控制如何影响运行时堆栈。它详细介绍了存储参数和返回值的位置,因此它们可以在调用或调用函数中可用。分配和交易记忆只是简单地减少并以适当的量增加堆栈指针。如果您有兴趣并想了解更多,那么这本书真的很有帮助。
学到了什么?Clap your to say “thanks!” and help others find this article.
(*)只能在堆栈上分配在编译时间已知的固定大小的对象。除了有趣的事情可变长度阵列在C99中。GCC将它们分配在堆栈上。