堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?


当前回答

当调用函数时,当调用该函数的参数加上一些其他间接费用时,会将数据堆放到堆栈中。一些信息(例如返回何处)也存储在那里。当您在函数中声明变量时,该变量也会被分配到堆栈中。

分配堆栈非常简单, 因为您总是在分配的反向顺序中进行排列。 在输入函数时会添加堆叠材料, 当退出时相应的数据会被删除。 这意味着您往往会留在堆栈的狭小区域, 除非您调用许多函数来调用其他函数( 或者创建循环解决方案 ) 。

堆积堆是一个通用名称, 用于您将创建的数据放在哪里 。 如果您不知道您的程序将创建多少飞船, 您可能会使用新的( 或商场或等效的) 操作器来创建每艘飞船 。 此分配将会停留一段时间, 因此我们很可能释放的东西 以不同于我们创建的顺序 。

因此,堆积要复杂得多,因为最终会出现一些未使用的记忆区域,这些区域与块间断 — — 内存会变得支离破碎。 找到您需要的大小的自由记忆是一个困难的问题。 这就是为什么应该避免堆积( 尽管它仍然经常被使用 ) 。

执行堆叠和堆叠通常要到运行时间 / os. 通常游戏和其他功能对于性能至关重要的应用程序会创建自己的内存解决方案,从堆叠中抓取一大块内存,然后在内部将内存分离出来,以避免依赖 os 来进行内存。

只有当你的记忆用法与常规有很大不同时, 也就是在游戏中, 在一个巨大的操作中加载一个水平, 并且可以在另一个巨大的操作中将整个批量扔掉时, 这才是实际的。

内存中的物理位置比你想的要少, 这是因为一种叫做虚拟内存的技术, 它使得您的程序认为您可以进入某个地址, 物理数据在其他地方( 即使是在硬盘上!) 。 您获得的堆叠地址随着调用树越深, 顺序越大。 堆积的地址是无法预测的( 具体化) , 坦率地说并不重要 。

其他回答

堆叠堆叠

记忆不会成为支离破碎的本地变量, 只能对堆叠大小(依赖的)变量进行限制, 无法调整大小

堆肥

可在全球范围内访问变量,没有内存大小的限制(相对而言)更慢的存取,没有保证有效使用空间的保障,随着分配内存区块,内存可能会随着时间而变得支离破碎,然后释放后,你必须管理内存(你负责分配和释放变量),变量可以使用地环调整大小()

堆叠基本上是一个容易获取的内存,它只是将项目管理成一个 - 井 - 堆叠。只有事先知道其大小的物品才能进入堆叠。数字、字符串、布林恩就是这种情况。堆叠是无法预设准确大小和结构的物品的内存。由于天体和阵列可以在运行时变形和改变,它们必须进入堆叠。

源源代码:academinide

什么是堆叠?

堆叠是一堆物体, 通常是排列整齐的物体。

计算架构中的堆栈是内存区域, 数据以最先出错的方式被添加或删除。 在多行应用程序中, 每串线索将有自己的堆栈 。

什么是堆积物?

堆积成堆的堆积物, 堆积成堆。

在计算结构中,堆积是一个动态分配的内存区域,由操作系统或内存管理库自动管理。 堆积上的内存在程序执行期间被分配、 分配和定期调整, 这可能导致一个叫做碎裂的问题。 当内存物体在小空格中被分配时, 碎片就会发生, 这些空格太小, 无法持有额外的内存对象。 净结果为堆积垃圾邮件的百分比 。

两者加在一起

在一个多行应用程序中, 每串线索都有自己的堆叠。 但是, 所有不同的线条都会共享堆积。 因为不同的线条在一个多行应用程序中共享堆积, 这还意味着线条之间必须有一些协调, 以便它们不会试图同时访问和操作堆积中的同一块内存 。

这是更快的--堆叠还是堆叠?为什么?

堆栈比堆叠要快得多。 这是因为堆叠上的内存分配方式。 堆叠上的内存分配和堆叠指针向上移动一样简单 。

对于新到编程的人来说,使用堆叠可能是一个好主意,因为堆叠比较容易。 因为堆叠是小的, 当你确切知道数据需要多少内存, 或者知道数据大小非常小时, 你会想使用它。 当你知道数据需要大量内存的时候, 使用堆叠比较好, 或者你不确定你需要多少内存( 如动态阵列 ) 。

Java记忆模型

堆栈是存储本地变量(包括方法参数)的内存区域。当涉及到对象变量时,这些变量只是堆积中实际对象的引用(指针)。每当一个对象被即时化,就会留出一块堆积内存以保持该对象的数据(状态)。由于对象可以包含其他对象,有些数据实际上可以保留这些嵌套对象的引用。

最重要的一点是,堆积和堆叠是可分配记忆的方式的通用术语。 它们可以用许多不同的方式加以实施,这些术语适用于基本概念。

在一个堆叠的项目中,项目按放在另一堆的顺序坐在一个上方,您只能删除顶端的(不折叠整个事情)。 堆叠的简单性在于您不需要保存包含分配内存每一部分记录的表格; 您唯一需要的状态信息是到堆叠的尾端的单指针。 要分配和拆分, 您只需要递增和缩减单指针。 注意: 堆叠有时可以简单化 。

这些图像应该做一个相当不错的工作, 描述两种方式 分配和释放记忆 在堆叠和堆积。 yum!

如前所述,堆叠和堆叠是通用的术语,可以多种方式实施。计算机程序通常有一个称为呼叫堆叠的堆叠,存储与当前函数有关的信息,例如指向它从哪个函数中调出的任何函数,以及任何本地变量。因为函数调用其他函数,然后返回,堆叠和堆叠会增长和缩缩,以便从函数中往下保持信息。

它们(在真实的计算机记忆中)在哪里和什么?

回答:两者都是在山上。

暂不考虑 :

公牛就像一张书桌, hdds/sds(永久存储)就像一张书架。 要阅读任何东西, 您必须在桌子上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您可以从书架上拉出来, 并在桌子上打开。 返回一本书, 您关闭桌子上的书架, 然后把它还给书架 。

堆叠和堆肥是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即用大号堆放)。

它们的范围是什么?它们各自的大小由什么决定?一个的大小由什么决定?一个的大小由什么决定?

答复:

堆栈是静态(固定大小) a. 编译器读取您代码中使用的变量类型。i. 它为这些变量分配了固定的内存量。 ii. 此内存的大小无法增长。 b. 内存是毗连的( 单块) , 因此存取有时比堆叠的更快。 放在堆叠上的一个物体在堆叠大小超过其大小的运行时会增加内存, 导致堆叠溢出错误, 堆积是动态( 变化大小) 数据 a. amoun 。

暂不考虑 :

堆叠和堆肥主要不是为了提高速度而引入的;它们被引入是为了处理内存溢出。 有关堆叠与堆积之间的第一个问题应该是:是否会出现内存溢出。 如果一个物体的大小打算增长到一个未知的数量(如链接的清单或其成员可以持有任意数量数据的对象),则将其放入堆肥。 尽可能使用 c++ 标准库(stl) 容器矢量、 地图和列表,因为它们是内存和列表。

在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后回去重新构思您的代码, 并检查它是否能够更高效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 i/ o / vs. cpu- imbound 任务, 也许添加多读或多处理 ) 。

因为程序的速度可能与堆叠或堆叠上分配的物品无关。

在多大程度上它们受国家或语言的运行时间控制?

答复:

堆叠大小由编译者在编译时确定。 堆积大小在运行时会变化。 (堆积在运行时与 os 一起工作,以分配内存 。)

暂不考虑 :

下面是控制和编译时间相对于运行时间操作的多一点。

每台计算机都有独特的指令集结构(isa),这是其硬件命令(例如“移动”、“跳”、“跳”、“添加”等)。

a os 只不过是一个资源管理者(控制如何/时间/和何处使用内存、处理器、装置和信息)。 os 的状态被称为光机,其余的命令被称为扩展机。 内核是扩展机的第一层。 它控制着诸如确定什么任务可以使用处理器(调度器)、多少内存或有多少硬件登记册可以分配给任务(调度器),以及任务的顺序。