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


当前回答

短短

a 堆叠用于静态内存分配和动态内存分配,两者都储存在计算机的顶部。


详细详细

堆叠堆叠

堆栈是一个“ lifo”( 最后一个, 第一个出来) 数据结构, 由 cupu 非常密切地管理和优化。 每次函数在显示新的变量时, 它会“ 挂在” 堆栈上。 然后, 每次函数退出, 所有被该函数推到堆栈的变量都被解开( 也就是说, 它们被删除 ) 。 一旦打开堆叠变量, 内存区域就会为其他堆叠变量提供 。

使用堆叠存储变量的优点是, 内存被管理 。 您不需要用手来分配内存, 也无需在不再需要时释放内存 。 更何况, 因为 CDP 组织堆叠内存的效率如此高, 读取和写入到堆叠变量的速度非常快 。

在此可以找到更多 。


堆积物,

计算机的内存区域不自动管理, 也不由 cpu 进行严格管理。 它是一个更自由的内存区域( 且更大) 。 要在堆中分配内存, 您必须使用 bloc () 或 calloc () , 它们是内嵌的 c 函数 。 一旦您在堆中分配内存, 您就有责任使用 free () 来在不再需要内存时处理内存 。

如果您不这样做, 您的程序将会有所谓的内存泄漏。 也就是说, 堆积上的内存仍将被搁置( 并且无法用于其它进程 ) 。 正如我们在调试部分看到的那样, 有一个名为 valgrind 的工具可以帮助您检测内存泄漏 。

与堆叠不同, 堆积的大小没有变量大小限制( 除了您的计算机的明显物理限制之外 ) 。 堆积的内存读和书写要慢一点, 因为需要用指针来访问堆积的内存 。 我们很快会讨论指针问题 。

与堆叠不同的是,在堆积上创建的变量可以被任意函数进入,在您的程序中的任何地方。堆积变量在范围上基本上是全球性的。

在此可以找到更多 。


堆栈上分配的变量直接存储到内存中, 访问此内存的时间非常快, 当程序编译时会处理其分配。 当函数或方法调用另一个函数, 转而调用另一个函数等时, 所有这些函数的履行将一直暂停, 直到最后一个函数返回其值。 堆栈总是保留在 lifo 顺序中, 最近保留的块总是下一个要解开的块 。

堆积上分配的变量的内存在运行时间分配,而访问此内存的时间稍慢一些,但堆积大小仅受虚拟内存大小的限制。 堆积中的元素不互相依赖, 随时可以随机访问。 您可以随时分配块块, 并随时释放它。 这使得跟踪堆积中哪些部分在任何特定时间分配或自由, 变得更加复杂 。

如果您确切知道在编译时间之前需要分配多少数据,您可以使用堆叠,而它并不太大。如果您不知道运行时需要多少数据,或者如果您需要分配大量数据,您可以使用堆叠。

在多轨情况下, 每串线索将拥有自己的完全独立的堆叠, 但是它们会共享堆叠 。 堆叠是特定的线条, 堆叠是特定的应用程序 。 堆叠很重要, 在例外处理和丝线处决中需要考虑 。

每一串线索都有堆叠, 而通常应用程序只有一堆(尽管对于不同种类的分配来说, 多堆堆并不罕见) 。

运行时, 如果应用程序需要更多堆肥, 它可以从空闲的内存中分配内存, 如果堆叠需要内存, 它可以从空闲的内存中分配内存, 用于应用程序的内存中分配内存 。

即使如此,这里和这里还有更详细的内容。


现在来回答你的问题吧

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

当线索创建时, os 分配每个系统级线索的堆叠。 通常, os 被语言运行时间调用来分配应用程序的堆叠 。

在此可以找到更多 。

其范围是什么?

已经在上方给定 。

“如果你确切知道在编译时间之前你需要分配多少数据,你可以使用堆叠。它并不太大。如果你不知道运行时你需要多少数据,或者你需要分配很多数据,你可以使用堆叠。”

在此可以找到更多 。

是什么决定了每个孩子的大小?

当创建线索时,堆栈的大小由 OS 设定。 程序启动时会设置堆积的大小, 但随着需要空间, 堆堆的大小会扩大( 分配器要求操作系统有更多的内存 ) 。

是什么让一个更快?

堆叠分配速度要快得多, 因为实际上它所做的就是移动堆叠指针。 使用内存池, 您可以从堆积分配中获取相似的性能, 但是这伴随着稍微增加的复杂性和它本身的头痛。

此外,堆叠对堆肥不仅是对性能的考量;它也告诉你很多关于物体的预期寿命。

在此可以找到细节 。

其他回答

堆叠堆叠

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

堆肥

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

我有一些要分享的,虽然主要要点已经涵盖在内。

堆叠堆叠

快速访问。 存储在 rap 中。 函数调用会与本地变量和函数参数一起装入这里。 当程序退出范围时, 空间会自动释放。 存储在连续内存中 。

堆肥

相对于堆叠的存取速度较慢。 储存在堆叠中。 动态生成的变量存储在这里, 以后需要使用后释放分配的内存 。 保存在存储分配处, 指示器总是访问 。

有意思的注意:

如果功能电话被储存在堆叠中,就会造成两个混乱点:由于堆叠中顺序存储,执行速度更快。 堆积中储存会导致大量时间消耗,从而使整个程序的执行速度放慢。 如果功能被储存在堆积中(指针指向的混凝土存储器),就不可能返回调用地址(由于堆叠中顺序存储内存而导致堆叠) 。

科学家在最初决定两个建筑(Von Neumann,这里所有东西都被视为数据,Harvard,那里保留了用于指示的记忆区和另一个数据区)之间。 最终,我们采用了von Neumann设计,现在一切都被认为是“相同的”。 当我在学习组装时,这让我很难接受 https://www.cs.virginia.edu/~evans/cs216/guides/x8。

上面所有内容都在谈论数据。我的猜测是,既然教学是一个定义的事物, 带有特定的记忆足迹, 它会进入堆叠, 所以所有在集合中讨论的“ 那些” 登记册都在堆叠中。 当然, 然后以对象为方向的编程, 将指示和数据混合到一个动态的结构中, 所以现在指示也会被保存在堆肥上?

我觉得大部分的答案都是非常复杂和技术性的, 而我没有找到一个可以简单地解释这两个概念背后的理由的答案(即为什么人们首先创造这些概念? )和为什么你应该关心。

堆叠上的数据为临时和自动清理数据

堆积上的数据在手动删除前是永久的

就是这样。

 

 

更确切地说,

堆叠是用来作为 短暂或工作记忆的, 一个我们知道的记忆空间 将经常被完全删除, 不论在我们的节目的一生中, 我们在那里设置的乱七八糟。 这就像你桌上的备忘,

然而,这个堆积物是长期的记忆, 实际重要的文件, 我们将会储存, 咨询, 并依赖它创建后很长一段时间。 因此,它需要有一个完美的形式, 并严格包含重要数据。 为什么它要花费很多, 并且不能用于我们先例备忘录的用法。 将我的所有笔记带进一份学术性文件演示文稿, 写成书法, 是没有价值的, 甚至完全没有用处的。 然而,这个演示文稿是用书法写成书法的。

大多数最上面的答案只是实际计算机实际应用这一概念的技术细节。

因此,要从中取出什么是:

使我们的功能和物体的工作(一般而言)更相关 储存在堆叠上。

重要、永久和基础应用数据(一般而言)更切合需要储存在堆积上。

这就是为什么你需要管理和处理堆积物上的记忆分配, 但不必为堆积物费心。

当然, 需要从您的程序寿命的角度来看待这一点。 实际的人类重要数据显然需要存储在外部文件中 。 ( 由于是堆肥还是堆叠, 当您的程序终止时, 它们都会完全清除 。 )

ps:这些只是一般规则,你总是能找到边缘案例,每种语言都有其自己的执行和由此产生的怪异之处,这是作为概念和大拇指规则的指导。

哇! 这么多答案,我觉得其中之一 没有得到正确的答案...

(在真实的计算机记忆中)在哪里?

堆栈是作为分配给您的程序图像的最高内存地址开始的内存,然后从那里降低值。它保留给所谓的函数参数和函数中使用的所有临时变量。

有两层楼:公营和私营。

私人堆积始于程序代码的最后一字节之后的16字节边界( 64比特程序)或8比特边界( 32比特程序),然后从中增加值。它也被称为默认堆积。

如果私人堆肥过大, 它会重叠堆叠区域, 如果堆叠太大, 堆叠也会重叠堆叠区域。 因为堆叠从更高的地址开始, 并一直往下工作到较低的地址, 适当的黑客可以使堆叠变得如此大, 它会超过私人堆肥区域, 并重叠代码区域。 那么, 技巧就是将代码区域重叠到足够大的地方, 从而可以连接到代码中。 这样做有点棘手, 你可能会冒程序崩溃的风险, 但是它很容易, 而且非常容易。

公用堆积在它自己的记忆空间中, 它不在您的程序图像空间之内。 如果记忆资源变得稀缺, 这个记忆将会被吸到硬盘上 。

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

堆叠由程序员控制, 私人堆积由操作员管理, 公众堆积不为任何人控制, 因为它是一种操作员的服务-- 你提出请求, 要么被批准,要么被拒绝。

2(b) 其范围是什么?

它们都是全球性的,但内容可以是私人的,公共的,也可以是全球性的。

2(c) 由什么因素决定每个小组的大小?

您的编译器运行时间选项决定了堆叠和私有堆放的大小。公共堆放使用大小参数在运行时初始化。

2(d) 是什么使一个速度更快?

程序程序员如何使用它们来决定它们是“快”还是“慢”

ref:

https://norasandler.com/2019/02/18/Write-a-Compiler-10.html

https://learn.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-getprocessheap

https://learn.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-heapcreate