堆栈与堆栈以及堆与堆
我正在为我的数据组织决赛进行学习,并且我正在经历堆叠和堆叠,因为我知道他们将进入决赛,我需要知道这些差异。 我知道堆栈是什么以及堆是什么。
但我很困惑什么是堆栈,堆是什么。
堆栈是存储内存的RAM中的一个地方,如果空间不足,发生堆栈溢出。 对象默认存储在这里,当对象超出范围时它会重新分配内存,并且速度更快。
堆是存储内存的RAM中的一个地方,如果空间不足,操作系统会为其分配更多内存。 对于要存储在堆中的对象,需要使用new,operator来告诉对象,并且只有在被告知时才会被释放。 碎片问题可能发生,它比堆栈慢,并且它可以更好地处理大量内存。
但是什么是堆栈,什么是堆? 这是内存的存储方式吗? 例如静态数组或静态向量是堆栈类型还是动态数组,链表是堆类型?
谢谢你们!
我不会进入虚拟内存(如果需要,请阅读这些内容),让我们简化并说您具有某种大小的RAM。
你有你的代码与静态初始化数据,一些静态未初始化的数据(静态在C + +的手段像全局变量)。 你有你的代码。
当您编译某些东西时,编译器(和链接器)会按照以下方式组织您的代码并将其转换为机器代码(字节代码,1和0):
二进制文件(和对象文件)被组织成段(RAM的部分)。
首先你有数据段 。 这是包含初始化变量值的段。 所以如果你有变量,即int a=3, b = 4
它们将转到DATA段(包含00000003h的4个字节的RAM和包含000000004h的其他4个字节,十六进制表示法)。 它们被连续存储。
然后你有代码段 。 你所有的代码都被转换成机器代码(1和0)并连续存储在这个段中。
然后你有BSS分段 。 有未初始化的全局变量 (所有未初始化的静态变量)。
然后你有STACK段 。 这是保留为堆栈。 堆栈大小默认由操作系统决定。 你可以改变这个值,但我现在不会进入。 所有局部变量都在这里。 当你首先调用某个函数时,函数args被压入堆栈,然后返回地址(当你退出函数时返回的地址),然后在这里推入一些计算机寄存器,最后在函数中声明的所有局部变量都获得它们在堆栈上的保留空间 。
你有HEAP段 。 这是RAM的一部分(大小也由操作系统决定),其中对象和数据使用操作符new
进行存储。
然后将所有的段依次堆积在DATA,CODE,BSS,STACK,HEAP。 还有其他一些细分市场,但这些细分市场对此并不感兴趣,并且由操作系统加载到RAM中。 二进制文件也有一些头文件,其中包含您的代码从哪个位置(内存中的地址)开始的信息。
所以简而言之,它们都是RAM的一部分 ,因为正在执行的所有内容都被加载到RAM中(不能在ROM中(只读),也不能在HDD上存储文件。
“堆栈”和“堆”是程序或操作系统以特定方式使用的内存块。 例如,调用堆栈可以保存与函数调用有关的数据,而堆是专门用于动态分配空间的内存区域。
将这些与堆栈和堆数据结构进行对比。
一个堆栈可以被认为是最后一个元素将是第一个元素的数组。 对此的操作称为推送和流行。
堆是一种数据结构,它表示一种特殊类型的图,其中每个节点的值大于该节点的子节点的值。
在附注中,请记住,“堆栈”或“堆”或任何堆栈/堆数据结构对于任何给定的编程语言都是唯一的,但它们只是计算机科学领域中的概念。
“堆栈”的技术定义是数据被推入顶端并从顶端拉出的“后进先出”(LIFO)数据结构。 就像现实世界中的一叠板块一样,您不会从中间或底部拉出一块板块,您[通常]不会将数据从数据结构堆栈的中间或底部拉出。 当有人在编程方面谈论堆栈时,它通常(但并非总是)意味着由CPU中的堆栈指针寄存器控制的硬件堆栈。
就“一堆”而言,就大家可以认同的定义而言,这通常变得更加模糊。 最好的定义很可能是“大量的空闲内存空间被分配给动态内存管理”。 换句话说,当你需要新的内存时,无论是数组还是用新操作符创建的对象,它都来自操作系统为程序保留的堆。 这是来自程序POV的“堆”,但仅仅是操作系统POV中的“堆”。
链接地址: http://www.djcxy.com/p/261.html