堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
堆叠堆叠
记忆不会成为支离破碎的本地变量, 只能对堆叠大小(依赖的)变量进行限制, 无法调整大小
堆肥
可在全球范围内访问变量,没有内存大小的限制(相对而言)更慢的存取,没有保证有效使用空间的保障,随着分配内存区块,内存可能会随着时间而变得支离破碎,然后释放后,你必须管理内存(你负责分配和释放变量),变量可以使用地环调整大小()
其他回答
我觉得大部分的答案都是非常复杂和技术性的, 而我没有找到一个可以简单地解释这两个概念背后的理由的答案(即为什么人们首先创造这些概念? )和为什么你应该关心。
堆叠上的数据为临时和自动清理数据
堆积上的数据在手动删除前是永久的
就是这样。
更确切地说,
堆叠是用来作为 短暂或工作记忆的, 一个我们知道的记忆空间 将经常被完全删除, 不论在我们的节目的一生中, 我们在那里设置的乱七八糟。 这就像你桌上的备忘,
然而,这个堆积物是长期的记忆, 实际重要的文件, 我们将会储存, 咨询, 并依赖它创建后很长一段时间。 因此,它需要有一个完美的形式, 并严格包含重要数据。 为什么它要花费很多, 并且不能用于我们先例备忘录的用法。 将我的所有笔记带进一份学术性文件演示文稿, 写成书法, 是没有价值的, 甚至完全没有用处的。 然而,这个演示文稿是用书法写成书法的。
大多数最上面的答案只是实际计算机实际应用这一概念的技术细节。
因此,要从中取出什么是:
使我们的功能和物体的工作(一般而言)更相关 储存在堆叠上。
重要、永久和基础应用数据(一般而言)更切合需要储存在堆积上。
这就是为什么你需要管理和处理堆积物上的记忆分配, 但不必为堆积物费心。
当然, 需要从您的程序寿命的角度来看待这一点。 实际的人类重要数据显然需要存储在外部文件中 。 ( 由于是堆肥还是堆叠, 当您的程序终止时, 它们都会完全清除 。 )
ps:这些只是一般规则,你总是能找到边缘案例,每种语言都有其自己的执行和由此产生的怪异之处,这是作为概念和大拇指规则的指导。
堆栈是内存的一部分,可以通过若干关键组装语言指令来操作,例如“pop”(从堆叠中移动并返回一个值)和“push”(将一个值推到堆叠中),但也可以调用(调用子例程 - 将地址推到堆叠中)和返回( 从子例程返回 - 将堆叠的地址从堆叠中跳出并跳到堆叠中)。这是堆叠指针登记册下方的内存区域,可以根据需要设置。堆叠也用于 pa 。
堆积是操作系统向一个应用程序提供的内存的一部分, 通常通过像马洛克这样的音响。 在现代套管上, 这个内存是一组只有呼叫程序才能进入的页面 。
堆叠的大小在运行时确定, 一般在程序启动后不会增长。 在 c 程序中, 堆叠需要足够大, 以保持每个函数中所有声明的变量。 堆叠会按需要动态增长, 但 巨头最终会发出呼唤( 它会增加的堆积量通常超过 merloc 要求的值, 这样至少有些未来的中枢不需要返回内核来获取更多的内核内存 。 此行为通常可以自定义 )
因为您在启动程序前已经分配了堆叠, 所以在您使用堆叠之前, 您从不需要在使用堆叠前使用滚动, 所以在实际操作中这是一个小的优势。 实际上, 很难预测什么是快速的,什么是缓慢的, 在拥有虚拟内存子系统的现代操作系统中, 因为这些页面是如何被安装的, 在哪里存储的, 是一个执行细节 。
其他人对大中风的反应也很好, 所以我要说几个细节。
堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。
void myfunction()
{
char big[10000000];
// Do something that only uses for first 1K of big 99% of the time.
}
最重要的一点是,堆积和堆叠是可分配记忆的方式的通用术语。 它们可以用许多不同的方式加以实施,这些术语适用于基本概念。
在一个堆叠的项目中,项目按放在另一堆的顺序坐在一个上方,您只能删除顶端的(不折叠整个事情)。 堆叠的简单性在于您不需要保存包含分配内存每一部分记录的表格; 您唯一需要的状态信息是到堆叠的尾端的单指针。 要分配和拆分, 您只需要递增和缩减单指针。 注意: 堆叠有时可以简单化 。
这些图像应该做一个相当不错的工作, 描述两种方式 分配和释放记忆 在堆叠和堆积。 yum!
如前所述,堆叠和堆叠是通用的术语,可以多种方式实施。计算机程序通常有一个称为呼叫堆叠的堆叠,存储与当前函数有关的信息,例如指向它从哪个函数中调出的任何函数,以及任何本地变量。因为函数调用其他函数,然后返回,堆叠和堆叠会增长和缩缩,以便从函数中往下保持信息。
(我将这一答案从另一个或多或少是本问题的代名词的问题移出。 )
您问题的答案是具体执行问题,可能因汇编者和处理结构而异。然而,这里是简单的解释。
堆叠和堆积都是从基本操作系统分配的内存区域(通常是虚拟内存,根据需要绘制成物理内存)。 在多轨环境中,每条线将有自己的完全独立的堆叠,但他们将共享堆叠。同时存取必须控制在堆积上,不可能在堆叠上。
堆积物,
堆积中含有一个用过的和自由的区块的链接列表。 堆积( 由新的或中转的) 上的新分配通过从一个自由区块中创建一个合适的区块来满足。 这需要更新堆积中的区块清单。 堆积中的区块的元信息也通常储存在堆积中, 保存在每个区块前面的小区域中。 当堆积中的新区块往往从下面的地址分配到更高的地址。 因此, 您可以将堆积视为一个堆积 o 。
调
堆叠堆叠
堆叠通常与名为堆叠指针的 cupu 上的特殊登记簿密切配合。 最初, 堆叠指针指向堆叠的顶部( 堆叠上的最高地址 ) 。 堆叠有将值推到堆叠上并将其从堆叠中弹出的特殊指令。 每一次推移都存储在堆叠指针当前位置的值, 并减少堆叠指针。 流行会检索堆叠指针指向的值, 然后增加堆叠指针( 不要) 。
调
能否在堆叠上而不是堆叠上分配函数 ?
否,函数(即本地变量或自动变量)的激活记录在堆栈上分配,不仅用于存储这些变量,还用于跟踪嵌套功能电话。
如何管理堆肥真的取决于运行时间环境。 c 使用中转器, c++ 使用新的, 但很多其他语言都有垃圾收集 。
然而,堆叠是一个更低层次的特征,它与处理器结构紧密相连。 当没有足够的空间时, 堆叠会生长成堆不会太难, 因为可以在处理堆叠的图书馆电话中执行。 然而, 堆叠的堆叠往往不可能增长, 因为堆叠溢出的时间太晚才被发现; 关闭行刑线是唯一可行的选择。