Jwa*_*ags 9 c++ heap stack heap-memory stack-memory
我正在为我的数据组织决赛学习,我正在研究堆栈和堆,因为我知道它们将进入决赛,我将需要了解差异。我知道堆栈是什么,堆是什么。
但是我对堆栈是什么和堆是什么感到困惑。
堆栈是 RAM 中存储内存的地方,如果空间不足,就会发生堆栈溢出。对象默认存储在这里,当对象超出范围时它会重新分配内存,并且速度更快。
堆是 RAM 中存储内存的地方,如果空间不足,操作系统会分配更多空间。对于要存储在堆上的对象,需要使用 new 运算符来告知它,并且只有在告知后才会被释放。可能会出现碎片问题,它比堆栈慢,并且可以更好地处理大量内存。
但是什么是栈,什么是堆?它是存储内存的方式吗?例如静态数组或静态向量是堆栈类型和动态数组,链表是堆类型?
谢谢你们!
“堆栈”和“堆”是程序或操作系统以特定方式使用的内存块。例如,调用堆栈可以保存与函数调用有关的数据,而堆是专门用于动态分配空间的内存区域。
将它们与堆栈和堆数据结构进行对比。
甲堆可以被认为是作为一个阵列,其中在最后元件将是第一个元素的。对此的操作称为 push 和 pop。
甲堆是一种数据结构,它表示一种特殊类型的曲线图,其中每个节点的值是比该节点的子节点的值。
附带说明一下,请记住,“堆栈”或“堆”或任何堆栈/堆数据结构对于任何给定的编程语言都是独一无二的,而只是计算机科学领域中的概念。
我不会进入虚拟内存(如果你愿意,请阅读相关内容)所以让我们简化一下,假设你有一定大小的 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 仅用于存储文件。
当专门提到 C++ 的内存模型时,堆和堆栈指的是内存区域。很容易将其与堆栈数据结构和堆数据结构混淆。然而,它们是独立的概念。
在讨论编程语言时,堆栈内存被称为“堆栈”,因为它的行为类似于堆栈数据结构。堆有点用词不当,因为它不一定(或可能)使用堆数据结构。请参阅为什么两个不同的概念都称为“堆”? 讨论为什么 C++ 的堆和数据结构的名称相同,尽管是两个不同的概念。
因此,要回答您的问题,这取决于上下文。在编程语言和内存管理的上下文中,堆和堆栈是指具有特定属性的内存区域。否则,它们指的是特定的数据结构。