堆栈与堆栈和堆与堆

Jwa*_*ags 9 c++ heap stack heap-memory stack-memory

我正在为我的数据组织决赛学习,我正在研究堆栈和堆,因为我知道它们将进入决赛,我将需要了解差异。我知道堆栈是什么,堆是什么。

但是我对堆栈是什么和堆是什么感到困惑。

堆栈是 RAM 中存储内存的地方,如果空间不足,就会发生堆栈溢出。对象默认存储在这里,当对象超出范围时它会重新分配内存,并且速度更快。

堆是 RAM 中存储内存的地方,如果空间不足,操作系统会分配更多空间。对于要存储在堆上的对象,需要使用 new 运算符来告知它,并且只有在告知后才会被释放。可能会出现碎片问题,它比堆栈慢,并且可以更好地处理大量内存。

但是什么是栈,什么是堆?它是存储内存的方式吗?例如静态数组或静态向量是堆栈类型和动态数组,链表是堆类型?

谢谢你们!

Mr.*_*ama 9

“堆栈”和“堆”是程序或操作系统以特定方式使用的内存块。例如,调用堆栈可以保存与函数调用有关的数据,而堆是专门用于动态分配空间的内存区域。

将它们与堆栈和堆数据结构进行对比。

可以被认为是作为一个阵列,其中在最后元件将是第一个元素的。对此的操作称为 push 和 pop。

是一种数据结构,它表示一种特殊类型的曲线图,其中每个节点的值是比该节点的子节点的值。

附带说明一下,请记住,“堆栈”或“堆”或任何堆栈/堆数据结构对于任何给定的编程语言都是独一无二的,而只是计算机科学领域中的概念。

  • @HotLicks - 在这一点上,我们将使用字典定义,而不是计算机科学定义。 (3认同)
  • 也许我应该更具体一些:在计算机科学的背景下,“堆”是一种满足堆属性的树型数据结构(其中每个节点的值小于其父值)。将计算机科学中的其他任何东西称为“堆”都会产生误导。例如,文件句柄的集合*不是*堆,因为它 1) 不是树结构并且 2) 不满足堆属性。 (2认同)

Nen*_*nad 6

我不会进入虚拟内存(如果你愿意,请阅读相关内容)所以让我们简化一下,假设你有一定大小的 RAM。

您的代码包含静态初始化数据,还有一些静态未初始化数据(C++ 中的静态表示类似于全局变量)。你有你的代码。

当您编译某些东西时,编译器(和链接器)将以以下方式组织您的代码并将其转换为机器代码(字节码、1 和 0):

二进制文件(和目标文件)被组织成段(RAM 的一部分)。

首先你有DATA 段。这是包含初始化变量值的段。因此,如果您有变量,即int a=3, b = 4它们将转到数据段(RAM 的 4 个字节包含 00000003h,其他 4 个字节包含 000000004h,十六进制表示法)。它们是连续存储的。

然后你有代码段。您的所有代码都被翻译成机器代码(1 和 0)并连续存储在此段中。

然后你有BSS 段。有未初始化的全局变量(所有未初始化的静态变量)。

然后你有STACK 段。这是为堆栈保留的。默认情况下,堆栈大小由操作系统决定。你可以改变这个值,但我现在不会进入这个。所有局部变量都放在这里。当你调用某个函数时,首先func args被压入堆栈,然后返回地址(退出函数时返回的位置),然后将一些计算机寄存器压入此处,最后函数中声明的所有局部变量在堆栈上获得保留空间.

你有HEAP 段。这是 RAM 的一部分(大小也由操作系统决定),其中使用 operator 存储对象和数据new

然后所有的段一个接一个地堆积起来,依次是DATA、CODE、BSS、STACK、HEAP。还有一些其他段,但它们在这里并不重要,它们由操作系统加载到 RAM 中。二进制文件还有一些头文件,其中包含代码从哪个位置(内存中的地址)开始的信息。

简而言之,它们都是 RAM 的一部分,因为正在执行的所有内容都加载到 RAM 中(不能在 ROM(只读)中,也不能在 HDD 中,因为 HDD 仅用于存储文件。


Dav*_* S. 5

当专门提到 C++ 的内存模型时,堆和堆栈指的是内存区域。很容易将其与堆栈数据结构和堆数据结构混淆。然而,它们是独立的概念。

在讨论编程语言时,堆栈内存被称为“堆栈”,因为它的行为类似于堆栈数据结构。堆有点用词不当,因为它不一定(或可能)使用堆数据结构。请参阅为什么两个不同的概念都称为“堆”? 讨论为什么 C++ 的堆和数据结构的名称相同,尽管是两个不同的概念。

因此,要回答您的问题,这取决于上下文。在编程语言和内存管理的上下文中,堆和堆栈是指具有特定属性的内存区域。否则,它们指的是特定的数据结构。