- 什么是堆叠和堆叠?
- 他们在电脑记忆中身处何方?
- 它们在多大程度上受到操作系统或语言运行时间的控制?
- 其范围是什么?
- 是什么决定了它们的大小?
- 是什么让一个更快?
当前回答
维基安瑟寄来的
堆堆叠
当函数或方法调用一个函数或方法调用另一个函数,而该函数轮流调用另一个函数等时,所有这些函数的履行将一直暂停,直到最后一个函数返回其值。
此挂起功能调用链是堆叠, 因为堆叠( 功能调用) 中的元素互相依赖 。
在例外情况处理和线索处决中,堆叠很重要。
堆肥
堆积仅仅是存储变量的程序所使用的内存。 堆积( 变数) 元素之间没有相互依存关系, 随时可以随机访问 。
其他回答
CPU堆和堆肥与CPU和登记簿如何与记忆工作、机器组合语言如何运作、而不是高层次语言本身有实际联系,即使这些语言能决定小事。
所有现代CPU都与“相同”微处理理论合作: 它们都基于所谓的“ 注册者” 和一些“ 堆叠” 来取得性能。 所有 CPU 从一开始就有堆叠登记簿, 并且他们总是在这里, 正如我所知。 议会语言从一开始就是相同的, 尽管有各种变化... 直到微软及其中间语言(IL) 改变了范式, 有了OO虚拟机组装语言。 因此, 我们将来可以有一些 CLI/ CIL CPU (一个MS项目) 。
CPU有堆叠登记册来加速存取记忆,但与其他登记册相比,这些登记册有限,无法完全获取进程的所有可用内存。 这就是为什么我们谈论堆叠和堆积分配的原因。
简而言之,总的来说,堆积是慢慢的,用于“全球”实例和对象内容,因为堆叠的体积很小,速度很快,用于“本地”变量和参考(隐藏的指针要忘记管理它们)。
所以当我们用一种方法使用新关键字时, 引用( int) 是在堆叠中创建的, 但是对象及其所有内容( 价值类型以及对象) 都在堆积中创建, 如果我记得的话。 但是本地基本值类型和阵列是在堆叠中创建的 。
内存存存取的差别在于单元格参考级别:处理堆积,即整个过程的记忆,在处理CPU登记册方面要求比处理堆叠更为复杂,因为如果我记得,CPU堆叠登记册被用作基地址,因此,处理堆积存存存存取的差别就大于当地“更多”的堆叠。
这就是为什么当我们有非常长或无限的循环电话或循环时, 我们很快地被堆积物溢出, 而不冻结现代电脑上的系统...
C# Heap(ing) Vs Stack(ing) in.NET
https://en.wikipedia.org/wiki/Memory_management
https://en.wikipedia.org/wiki/Stack_register
大会语文资源:
它们在哪里? 它们在哪里? (在真实的电脑记忆中)
回答: 两者都在记录和档案调控系统。
分会 :
内存就像一个书桌, HDDs/ SSDs( 永久存储) 像书架一样。 要阅读任何东西, 您必须在桌上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您必须把它从书架上拉出来, 然后在桌子上打开。 要退回一本书, 您必须关闭桌上的书架, 然后把它归还到书架上 。
堆积和堆积是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即记录和档案管理)。
其范围是什么?
是什么决定了每个孩子的大小?
是什么让一个更快?
回答:
堆叠为静态(固定大小)数据
a 。编译者在编译时读取代码中使用的变量类型。
(一) 为这些变量分配固定数量的内存。
二. 此记忆的大小无法增长 。b. b. 数据内存是毗连的( 单个区块) , 所以访问是 有时有时 比堆积速度快
c. 用于以下目的:放置在堆叠堆叠上的一个物体,该物体在超过堆叠大小的运行时会生成内存,导致 堆堆堆堆堆溢溢溢出错误
堆肥用于动态(变化大小)数据
a 。内存量仅受内存存储器可用空空空间数量的限制
(一) 使用的数量在运行时可按需要增长或缩减。b. b. 数据由于项目在堆积上分配,只要在内存记录和档案记录室中存在空空空间,数据并不总是在毗连部分中,而 有时有时 访问比堆叠慢
c. 用于以下目的:程序手动将项目与
new
keyword 和 Must 手动移动此内存, 当它们使用它完成后 。
一. 重复分配新内存的代码,在不再需要新内存时,不将新内存分配到内存泄漏。
分会 :
堆叠和堆积堆肥主要不是为了提高速度而引入;它们被引入是为了处理内存溢出。关于堆叠与堆积之间的第一个关注点应该是是否会出现内存溢出。如果一个对象打算将大小扩大为未知数量(如链接列表或其成员可以持有任意数量数据的对象),则将其放置在堆积上。尽可能使用 C++ 标准库(STL) 容器。矢量, 地图图图图地图, 和列表列表因为它们是记忆和速度效率高的,并增加使你的生活更加轻松(你不必担心记忆分配/迁移)。
在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后返回并重新构思您的代码, 并查看它是否能够更有效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 I/ O 对 CPU 的任务, 也许添加多读或多处理 ) 。
我说有时有时速度较慢/ 较快, 因为程序的速度可能与堆叠或堆叠上分配的项目无关 。
它们在多大程度上受到操作系统或语言运行时间的控制?
回答:
堆叠大小由汇编者在汇编时确定。
在运行期间,堆积大小各有不同。 (堆积在运行时与操作系统一起工作,以分配内存。)
分会 :
以下是更多关于控制和编译时间与运行时间操作的更多信息。
每台电脑都有独特的指令设置结构(ISA),即其硬件指令(例如“MOVE”、“JUMP”、“ADD”等)。
操作系统只不过是一个资源管理者(控制如何/何时/和何处使用内存、处理器、装置和信息)。
安全操作系统的ISA被称为光机其余命令被命名为扩展机。内核是扩展机器的第一层。 它控制着类似
- 确定要使用处理器(调度器)的任务,
- 分配给任务(调度员)的内存多少或硬件登记册多少,以及
- 执行任务的顺序(交通控制器)。
当我们说“编译者”时,我们通常是指编译者、组装者和链接者在一起
- 编译者将源代码转换为组装语言,并将其传给装配者,
- 装配器将装配语言转换成机码(ISA命令),并传给链接器
- 链接器将所有机器代码( 可能来自多个源文件) 合并成一个程序 。
机器代码在被执行时传递到内核, 由内核决定它何时应该运行并控制, 但机器代码本身包含ISA命令, 用于请求文件, 请求内存等。 所以代码发布 ISA 命令, 但一切都要通过内核 。
堆叠是记忆的一部分, 可以通过若干关键组装语言指令来操作, 如“ pop”( 移动并返回堆放中的值) 和“ push” (将值推到堆放中) , 但也可以调用( 调用子例程 - 将地址推回堆放中) 和调用( 从子例程返回 - 将堆放中的地址从堆放中跳出, 跳到堆放中) 。 这是堆叠指针登记册下的内存区域, 可根据需要设置 。 堆叠还用于将参数通过子例程, 并在调用子例程前保存登记册中的值 。
堆积是操作系统向一个应用程序提供的内存的一部分,通常通过像麦洛克这样的轮号。 在现代操作系统上,这个内存是一组只有呼叫程序才能进入的页面。
堆叠的大小在运行时确定, 通常在程序启动后不会增长。 在 C 程序中, 堆叠需要足够大, 以保持每个函数中所有声明的变量。 堆叠会根据需要动态增长, 但操作系统最终会发出呼唤( 它会增加的堆积量往往超过 merloc 所要求的值, 这样至少有些未来的中枢不需要返回内核以获取更多的内核内存。 这种行为通常可以自定义 )
因为您在启动程序前已经分配了堆叠, 所以在您使用堆叠之前, 您从不需要使用堆叠, 所以这有点优势。 实际上, 很难预测什么是快速的, 在拥有虚拟内存子系统的现代操作系统中什么是缓慢的, 因为这些页面是如何执行的, 在哪里存储的, 是一个执行细节 。
堆叠当您调用函数时,该函数的参数加上一些其他间接费用被放在堆栈中。有些信息(例如返回后将到何处)也存储在那里。当您在函数中声明变量时,该变量也分布在堆栈中。
拆分堆栈很简单, 因为您总是按照您分配的反向顺序进行排列。 在输入函数时添加堆叠材料, 当退出时相应数据将被删除。 这意味着您倾向于留在堆叠的小区域内, 除非您调用许多函数来调用其他函数( 或创建循环解决方案 ) 。
堆肥堆积是一个通用的名称, 用于您将创建的数据放在哪里 。 如果您不知道您的程序要创建多少宇宙飞船, 您可能会使用新的( 或商略或等效的) 操作员来创建每艘宇宙飞船 。 此分配将会停留一段时间, 因此我们很可能释放的东西, 与我们创建的顺序不同 。
因此,堆积要复杂得多,因为最终会出现一些未使用的内存区域,这些区域与块状的内存间断 — — 内存会变得支离破碎。 找到您需要的大小的自由内存是一个困难的问题。 这就是为什么应该避免堆积(尽管它仍然经常被使用 ) 。
执行 执行 执行堆叠和堆叠的操作通常要到运行时间/操作系统。 通常游戏和其他功能至关重要的应用程序会创造自己的内存解决方案,从堆叠中抓取大量内存,然后在内部将内存分离出来,以避免依赖操作系统进行内存。
只有当你的记忆用法与常规有很大不同时, 也就是在游戏中, 在一个巨大的操作中加载一个水平, 并且可以在另一个巨大的操作中将整个批量扔掉时, 这才是实际的。
内存物理位置这比你想的要少 因为一种技术叫做虚拟内存这使得您的程序认为您可以访问某位地址, 物理数据在其他地方( 甚至是硬盘上! ) 。 您获得的堆叠地址随着您的呼叫树越深, 顺序越大。 堆放的地址是不可预知的( 具体化) , 坦率地说并不重要 。
我想许多其他人 已经给了你 大多是正确的答案 这个问题。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。