出版于

Fhinkel

对堆栈和堆感到困惑?

认罪,我一直很难保持堆栈并分开。是的,我已经阅读了有关内存管理的信息,然后记住了分配的对象新的继续堆。但是我不得不简短地考虑该位置是堆栈还是堆。有点像我必须考虑东西方。但是有什么分配意思?为什么它与堆栈有所不同?为什么还重要?

在Java或C#中,值类型(原始)存储在堆栈上,引用类型在堆上。根据堆栈和堆的记忆分配未指定C ++标准。相反,标准区分自动的动态storage持续时间。本地变量具有自动存储持续时间,并且编译器将其存储在堆栈中。具有动态内存分配的对象(创建新的)存储在免费商店中,通常称为堆。在未垃圾收集的语言中,如果没有释放,则堆上的对象会导致内存泄漏。

彼此堆叠,或无序的堆。简单的概念。

我们什么时候可以分配堆栈上的对象?一个重要的细节是存储对象的堆栈与运行时调用堆栈相同。由堆栈帧组成的运行时堆栈负责程序执行和函数调用。堆栈框架包含一个函数调用的所有数据:其参数,返回地址及其本地变量。堆栈分配的对象是这些局部变量的一部分。返回地址确定函数返回后执行的代码。

堆栈框架仅在函数的执行时间内存在,堆栈帧上的对象也存在。这具有一个优势,即我们不必担心由堆栈分配的对象引起的内存泄漏 - 但是一旦我们从函数返回,对象也不再可用。

只能在堆栈*上分配固定大小的对象。这样,我们就知道编译时堆栈框架的大小,并且可以在堆栈上使用固定偏移相对于堆栈指针访问对象。

X86-64构建结构的通用堆栈框架结构调用功能q。

我们什么时候可以分配堆上的对象?您可以将堆视为额外的存储,完全独立于运行时堆栈。它是没有特定布局的内存。独立于程序执行,我们可以在此堆中要求内存。当我们分配内存时,系统确保没有其他东西可以使用相同的内存并使我们的数据无效。堆上的对象在我们退出分配内存的功能后。这很好 - 但是现在,我们有责任在堆上释放内存,或者我们最终会出现内存泄漏。在垃圾收集的语言中,垃圾收集器在堆上释放内存并防止内存泄漏。

在内存管理的背景下,堆栈和堆一直是我的模糊概念。了解运行时堆栈最终使其单击。

当我阅读时,堆栈和堆变得清晰计算机系统:程序员的观点(第三版)。现在似乎很明显,但是一旦您理解了某些东西,总是很明显。

计算机系统:程序员的观点(第三版)

这本书有几章有关程序的机器级代表。这些章节是关于装配代码的。一个小节运行时间堆栈

该部分说明了功能之间的传递控制如何影响运行时堆栈。它详细介绍了存储参数和返回值的位置,因此它们可以在调用或调用函数中可用。分配和交易记忆只是简单地减少并以适当的量增加堆栈指针。如果您有兴趣并想了解更多,那么这本书真的很有帮助。

学到了什么?Clap your to say “thanks!” and help others find this article.

(*)只能在堆栈上分配在编译时间已知的固定大小的对象。除了有趣的事情可变长度阵列在C99中。GCC将它们分配在堆栈上。

查看我的博客有关更多内容v8和node.js✨✨

- -

- -

获取中型应用betway娱乐官网

一个说“在应用商店上下载”的按钮,如果单击,它将带您到iOS App Store
一个说“获取它,Google Play”的按钮,如果单击它,它将带您到Google Play商店
Franziska Hinkelmann

Franziska Hinkelmann

微软的主要工程经理。Node.js猴子补丁。

Baidu