堆栈与堆栈和堆与堆的堆栈

时间:2014-05-06 20:59:47

标签: c++ memory memory-management stack heap

我正在为我的数据组织决赛进行学习,而且我正在进行堆栈和堆积,因为我知道他们将进入决赛并且我将需要知道差异。 我知道堆栈是什么以及堆是什么。

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

堆栈是存储内存的RAM中的一个位置,如果空间不足,则会发生堆栈溢出。默认情况下,对象存储在此处,当对象超出范围时,它会重新分配内存,而且速度更快。

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

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

谢谢大家!

5 个答案:

答案 0 :(得分:4)

我不会进入虚拟内存(如果你愿意,可以阅读),所以让我们简化并说你有一些大小的RAM。

您的代码包含静态初始化数据,其中包含一些静态未初始化数据(C ++中的静态数据意味着像全局变量)。你有你的代码。

编译时,编译器(和链接器)将以下列方式组织代码并将其转换为机器代码(字节代码,1和0):

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

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

然后您有代码段。您的所有代码都将转换为机器代码(1和0)并连续存储在此段中。

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

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

您有 HEAP细分。这是RAM的一部分(大小也由OS决定),其中使用运算符 new 存储对象和数据。

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

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

答案 1 :(得分:3)

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

将这些与堆栈和堆 data structures 进行对比。

可以将stack视为一个数组,其中最后一个元素将是第一个元素。对此的操作称为推送和弹出。

heap是一种数据结构,代表一种特殊类型的图表,其中每个节点的值都大于节点子节点的值。

在旁注中,请记住"堆栈"或者"堆"或者任何堆栈/堆数据结构对于任何给定的编程语言都是唯一的,但它们只是计算机科学领域的概念。

答案 2 :(得分:0)

"堆栈的技术定义"是一种后进先出(LIFO)数据结构,其中数据被推入和拉出顶部。就像在现实世界中的一堆板块一样,你不会从中间或底部拉出一个板块,你[通常]不会从数据结构的中间或底部拉出数据堆。当有人在编程方面讨论 堆栈时,它通常(但不总是)意味着硬件堆栈,它由CPU中的堆栈指针寄存器控制。

至于"一堆"换句话说,就每个人都可以达成一致的定义而言,这通常变得更加模糊。最好的定义很可能是大量的空闲内存,从中为动态内存管理分配空间。"换句话说,当您需要新内存时,无论是数组还是使用new运算符创建的对象,它都来自操作系统为您的程序保留的堆。这是"堆"从你的程序的POV,但只是#34;一堆#34;来自OS的POV。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

了解堆栈的重要事项是堆栈和函数/方法调用之间的关系。每个函数调用都会在堆栈上保留空间,称为堆栈帧。此空间包含您的自动变量(在函数体内声明的变量)。退出函数时,堆栈框架及其包含的所有自动变量将消失。

这种机制在使用的CPU资源方面非常便宜,但这些堆栈分配变量的生命周期显然受到函数范围的限制。

另一方面,

堆上的内存分配(对象)可以永久存在"或者只要你需要它们而不考虑你的程序控制流程。不利的一面是,由于您没有获得这些堆分配对象的自动生命周期管理,您必须1)自己管理生命周期,或者2)使用智能指针等特殊机制来管理这些对象的生命周期。如果你弄错了你的程序有内存泄漏,或访问可能意外改变的数据。

Re:关于A堆栈与堆栈的问题:当您使用多个线程时,每个线程都有一个单独的堆栈,以便每个线程可以独立地流入和流出函数/方法。大多数单线程程序只有一个堆栈:"堆栈"用于通用术语。

同样对于堆积。如果您有特殊需求,可以分配多个堆,并在分配时选择应该使用哪个堆。这种情况不太常见(而且比我在这里提到的要复杂得多。)