我正在为我的数据组织期末考试而学习,我正在研究堆栈和堆,因为我知道它们将在决赛中,我需要知道它们之间的区别。我知道堆栈是什么和堆是什么。
但我搞不懂什么是堆栈,什么是堆。
堆栈是内存中存储内存的地方,如果内存空间不足,就会发生堆栈溢出。默认情况下,对象存储在这里,当对象超出作用域时,它会重新分配内存,而且速度更快。
堆是内存中存储内存的地方,如果内存空间不足,操作系统将分配更多内存。对于要存储在堆中的对象,需要使用新的运算符通知对象,并且只有在通知时才会解除分配。碎片问题可能会发生,它比堆栈慢,而且它能更好地处理大量内存。
但是什么是堆栈,什么是堆?这是存储内存的方式吗?例如,静态数组或静态向量是堆栈类型,而动态数组,链接列表是堆类型?
谢谢大家!
发布于 2014-05-06 21:06:44
“堆栈”和“堆”是程序或操作系统以特定方式使用的内存块。例如,调用堆栈可以保存与函数调用有关的数据,而堆是专门用于动态分配空间的内存区域。
将它们与堆栈和堆https://en.wikipedia.org/wiki/Data_structure进行对比。
堆栈可以被认为是一个数组,其中最后一个元素将是第一个输出元素。这方面的操作称为push和pop。
堆是一种数据结构,它表示一种特殊类型的图,其中每个节点的值都大于节点的子节点的值。
另外,请记住,“堆栈”或“堆”或任何堆栈/堆数据结构对于任何给定的编程语言都是唯一的,但只是计算机科学领域中的概念。
发布于 2014-05-06 21:21:30
我不会进入虚拟内存(如果你想读的话),所以让我们简化一下,假设您有一定大小的RAM。
您的代码具有静态初始化数据,还有一些静态未初始化数据( C++中的静态数据意味着全局vars)。你有你的密码。
当您编译某些代码时,编译器(和链接器)将以下列方式组织代码并将其转换为机器代码(字节码、1和零):
二进制文件(和对象文件)被组织成段(RAM的一部分)。
首先是数据段。这是包含初始化变量值的段。因此,如果u有变量,即int a=3, b = 4,它们将进入数据段(包含00000003h的4个内存字节,以及包含000000004h十六进制表示法的其他4个字节)。它们是连续存储的。
然后是代码段。您的所有代码都被转换为机器代码(1s和0s),并连续存储在此段中。
然后是BSS段。出现了未初始化的全局vars (所有未初始化的静态vars )。
然后是堆栈段。这是为堆栈保留的。默认情况下,堆栈大小由操作系统决定。你可以改变这个值,但我现在不想谈这个问题。所有局部变量都在这里。当您调用某个函数时,首先将函数args推入堆栈,然后返回地址(退出函数时返回的位置),然后在这里推送一些计算机寄存器,最后在函数中声明的所有局部变量在堆栈上获得它们的保留空间。
还有堆段。这是内存的一部分(大小也由OS决定),其中的对象和数据是使用操作符new.存储的。
然后,所有的段是一个接一个的数据,代码,BSS,堆栈,堆。还有一些其他的部分,但它们在这里并不重要,这是由操作系统加载在RAM中的。二进制文件还包含一些标题,其中包含代码从哪个位置(内存中的地址)开始的信息。
因此,简而言之,它们都是RAM的一部分,因为正在执行的所有内容都被加载到内存中(不能在ROM (只读)中),也不能在硬盘上存储文件。
发布于 2014-05-06 21:13:49
当特别提到C++的内存模型时,堆和堆栈是指内存的区域,这很容易与堆栈数据结构和堆数据结构混淆,但是它们是不同的概念。
在讨论编程语言时,堆栈内存被称为“堆栈”,因为它的行为类似于堆栈数据结构。堆有点用词不当,因为它不一定(或者很可能)使用堆数据结构。有关C++的堆和数据结构的名称为何相同的讨论,请参见为什么两个不同的概念都被称为“堆”?,尽管这是两个不同的概念。
因此,要回答你的问题,这取决于背景。在编程语言和内存管理的上下文中,堆和堆栈引用具有特定属性的内存区域。否则,它们指的是特定的数据结构。
https://stackoverflow.com/questions/23504409
复制相似问题