堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
因为有些答案没有被选中, 我要贡献我的米特。
令人惊讶的是,没有人提到,不仅在外来语言(文稿)或平台(英特环)中,而且在纤维、绿线和一些共程实施中,都能找到多个(即与运行的骨层线数无关的)呼叫堆叠。
纤维、绿线和绿线在很多方面都相似,这导致许多混乱。 纤维和绿线之间的区别在于前者使用合作性多任务,而后者可能以合作性或先发制人(甚至两者兼而有之)为特点。
无论如何,两种纤维、绿线和共程的目的都是同时执行多种功能,但并非在单一星级线内平行执行(为区分而见此问题),以有组织的方式相互之间相互转移控制权。
当使用纤维、绿线或共程时,您通常每个函数都有单独的堆叠。 (在技术上,不只是堆叠,而是整个执行环境是每个函数。 最重要的是, cpu 登记册。 ) 对于每一个线串, 每一个线串都有与同时运行的函数一样多的堆叠, 而线串正在根据程序逻辑执行每个函数。 当函数运行到尾端时, 它的堆叠就会被销毁。 因此, 堆叠的数量和寿命都是个王宫 。
注意我所说的“ 通常每个函数有一个单独的堆叠 ” 。 有堆叠和堆叠的 courutines 。 最显著的堆叠 c++ 执行是 推进. coroutine 和 微软 ppl 的 async/ wait 。 (然而, c++ 的可恢复功能 (a. k. a. a. “ 合成和等待 ” ) , 这些功能被建议到 c++/17 , 可能会使用没有堆叠的 comutines 。 )
C++标准图书馆的纤维建议即将提出。 还有一些第三方图书馆。 绿线在Python 和 Ruby 等语言中非常受欢迎。
其他回答
最重要的一点是,堆积和堆叠是可分配记忆的方式的通用术语。 它们可以用许多不同的方式加以实施,这些术语适用于基本概念。
在一个堆叠的项目中,项目按放在另一堆的顺序坐在一个上方,您只能删除顶端的(不折叠整个事情)。 堆叠的简单性在于您不需要保存包含分配内存每一部分记录的表格; 您唯一需要的状态信息是到堆叠的尾端的单指针。 要分配和拆分, 您只需要递增和缩减单指针。 注意: 堆叠有时可以简单化 。
这些图像应该做一个相当不错的工作, 描述两种方式 分配和释放记忆 在堆叠和堆积。 yum!
如前所述,堆叠和堆叠是通用的术语,可以多种方式实施。计算机程序通常有一个称为呼叫堆叠的堆叠,存储与当前函数有关的信息,例如指向它从哪个函数中调出的任何函数,以及任何本地变量。因为函数调用其他函数,然后返回,堆叠和堆叠会增长和缩缩,以便从函数中往下保持信息。
其他人对大中风的反应也很好, 所以我要说几个细节。
堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。
void myfunction()
{
char big[10000000];
// Do something that only uses for first 1K of big 99% of the time.
}
因为有些答案没有被选中, 我要贡献我的米特。
令人惊讶的是,没有人提到,不仅在外来语言(文稿)或平台(英特环)中,而且在纤维、绿线和一些共程实施中,都能找到多个(即与运行的骨层线数无关的)呼叫堆叠。
纤维、绿线和绿线在很多方面都相似,这导致许多混乱。 纤维和绿线之间的区别在于前者使用合作性多任务,而后者可能以合作性或先发制人(甚至两者兼而有之)为特点。
无论如何,两种纤维、绿线和共程的目的都是同时执行多种功能,但并非在单一星级线内平行执行(为区分而见此问题),以有组织的方式相互之间相互转移控制权。
当使用纤维、绿线或共程时,您通常每个函数都有单独的堆叠。 (在技术上,不只是堆叠,而是整个执行环境是每个函数。 最重要的是, cpu 登记册。 ) 对于每一个线串, 每一个线串都有与同时运行的函数一样多的堆叠, 而线串正在根据程序逻辑执行每个函数。 当函数运行到尾端时, 它的堆叠就会被销毁。 因此, 堆叠的数量和寿命都是个王宫 。
注意我所说的“ 通常每个函数有一个单独的堆叠 ” 。 有堆叠和堆叠的 courutines 。 最显著的堆叠 c++ 执行是 推进. coroutine 和 微软 ppl 的 async/ wait 。 (然而, c++ 的可恢复功能 (a. k. a. a. “ 合成和等待 ” ) , 这些功能被建议到 c++/17 , 可能会使用没有堆叠的 comutines 。 )
C++标准图书馆的纤维建议即将提出。 还有一些第三方图书馆。 绿线在Python 和 Ruby 等语言中非常受欢迎。
(我将这一答案从另一个或多或少是本问题的代名词的问题移出。 )
您问题的答案是具体执行问题,可能因汇编者和处理结构而异。然而,这里是简单的解释。
堆叠和堆积都是从基本操作系统分配的内存区域(通常是虚拟内存,根据需要绘制成物理内存)。 在多轨环境中,每条线将有自己的完全独立的堆叠,但他们将共享堆叠。同时存取必须控制在堆积上,不可能在堆叠上。
堆积物,
堆积中含有一个用过的和自由的区块的链接列表。 堆积( 由新的或中转的) 上的新分配通过从一个自由区块中创建一个合适的区块来满足。 这需要更新堆积中的区块清单。 堆积中的区块的元信息也通常储存在堆积中, 保存在每个区块前面的小区域中。 当堆积中的新区块往往从下面的地址分配到更高的地址。 因此, 您可以将堆积视为一个堆积 o 。
调
堆叠堆叠
堆叠通常与名为堆叠指针的 cupu 上的特殊登记簿密切配合。 最初, 堆叠指针指向堆叠的顶部( 堆叠上的最高地址 ) 。 堆叠有将值推到堆叠上并将其从堆叠中弹出的特殊指令。 每一次推移都存储在堆叠指针当前位置的值, 并减少堆叠指针。 流行会检索堆叠指针指向的值, 然后增加堆叠指针( 不要) 。
调
能否在堆叠上而不是堆叠上分配函数 ?
否,函数(即本地变量或自动变量)的激活记录在堆栈上分配,不仅用于存储这些变量,还用于跟踪嵌套功能电话。
如何管理堆肥真的取决于运行时间环境。 c 使用中转器, c++ 使用新的, 但很多其他语言都有垃圾收集 。
然而,堆叠是一个更低层次的特征,它与处理器结构紧密相连。 当没有足够的空间时, 堆叠会生长成堆不会太难, 因为可以在处理堆叠的图书馆电话中执行。 然而, 堆叠的堆叠往往不可能增长, 因为堆叠溢出的时间太晚才被发现; 关闭行刑线是唯一可行的选择。
我觉得大部分的答案都是非常复杂和技术性的, 而我没有找到一个可以简单地解释这两个概念背后的理由的答案(即为什么人们首先创造这些概念? )和为什么你应该关心。
堆叠上的数据为临时和自动清理数据
堆积上的数据在手动删除前是永久的
就是这样。
更确切地说,
堆叠是用来作为 短暂或工作记忆的, 一个我们知道的记忆空间 将经常被完全删除, 不论在我们的节目的一生中, 我们在那里设置的乱七八糟。 这就像你桌上的备忘,
然而,这个堆积物是长期的记忆, 实际重要的文件, 我们将会储存, 咨询, 并依赖它创建后很长一段时间。 因此,它需要有一个完美的形式, 并严格包含重要数据。 为什么它要花费很多, 并且不能用于我们先例备忘录的用法。 将我的所有笔记带进一份学术性文件演示文稿, 写成书法, 是没有价值的, 甚至完全没有用处的。 然而,这个演示文稿是用书法写成书法的。
大多数最上面的答案只是实际计算机实际应用这一概念的技术细节。
因此,要从中取出什么是:
使我们的功能和物体的工作(一般而言)更相关 储存在堆叠上。
重要、永久和基础应用数据(一般而言)更切合需要储存在堆积上。
这就是为什么你需要管理和处理堆积物上的记忆分配, 但不必为堆积物费心。
当然, 需要从您的程序寿命的角度来看待这一点。 实际的人类重要数据显然需要存储在外部文件中 。 ( 由于是堆肥还是堆叠, 当您的程序终止时, 它们都会完全清除 。 )
ps:这些只是一般规则,你总是能找到边缘案例,每种语言都有其自己的执行和由此产生的怪异之处,这是作为概念和大拇指规则的指导。
推荐文章
- 在Objective-C中@property保留,赋值,复制,非原子
- Python内存泄漏
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 多少个参数是太多?
- 对于不可变集合上的非突变“add”方法,最好的名称是什么?
- Go中结构体的堆栈与堆分配,以及它们与垃圾收集的关系
- brk()系统调用做什么?
- foo到底是什么意思?
- foreach和map有区别吗?
- 为什么我应该使用Deque而不是Stack?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 什么是栈展开?
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?