- 什么是堆叠和堆叠?
- 他们在电脑记忆中身处何方?
- 它们在多大程度上受到操作系统或语言运行时间的控制?
- 其范围是什么?
- 是什么决定了它们的大小?
- 是什么让一个更快?
当前回答
我想许多其他人 已经给了你 大多是正确的答案 这个问题。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。
其他回答
我想许多其他人 已经给了你 大多是正确的答案 这个问题。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。
堆叠是作为执行线索的抓抓空间预留的内存。 当调用函数时, 在堆叠顶部保留一个区块, 用于本地变量和一些簿记数据。 当该函数返回时, 块会被未使用, 下次调用函数时可以使用。 堆叠总是保留在 LIFO 的顺序中( 最后一个在第一个出处) ; 最近保留的区块总是要解开的下一个区块 。 这样可以非常简单地跟踪堆叠; 从堆叠中释放一个区块只不过是调整一个指针而已 。
堆积是用于动态分配的内存。 与堆叠不同, 堆积区块的分配和分配没有强制模式; 您可以随时分配块块, 并随时释放它。 这就使得追踪堆积中哪些部分在任何特定时间分配或自由使用变得更加复杂; 许多定制的堆积分配器可以调和不同使用模式的堆积性能 。
每一串线索都有堆叠, 而通常应用程序只有一堆(尽管不同类型分配的多堆线索并不罕见) 。
直接回答你的问题:
它们在多大程度上受到操作系统或语言运行时间的控制?
当线索创建时, OS 会为每个系统级线索分配书架。 通常情况下, OS 会被语言运行时间调用来分配应用程序的堆积 。
其范围是什么?
堆栈附在线条上, 所以当线条退出时, 堆栈会被回收。 堆栈通常在运行时在应用程序启动时分配, 当应用程序( 技术处理) 退出时再回收 。
是什么决定了每个孩子的大小?
当创建线条时,会设定堆叠的大小。 程序启动时会设定堆积的大小, 但随着空间需要, 可能会增长( 分配器要求操作系统的内存更多 ) 。
是什么让一个更快?
堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存变得微不足道( 指针/ 内插器仅仅是递增或衰减) , 而堆叠在分配或交易地点的簿记上复杂得多 。 此外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 使其速度非常快 。 堆积的另一个性能冲击是, 堆积( 大多是一个全球资源) , 通常必须是多读的安全性, 也就是说, 每一个分配和交易地点需要 — 通常 — 与程序中的“ 所有” 其它堆积权限同步 。
明确表明:
图像来源 :vikashazrati.wordpress.com 译者注:
它们在哪里? 它们在哪里? (在真实的电脑记忆中)
回答: 两者都在记录和档案调控系统。
分会 :
内存就像一个书桌, 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 命令, 但一切都要通过内核 。
我有些话要说,尽管主要要点已经涵盖在内。
堆堆叠
- 非常快速的进入。
- 存储在记录和档案管理中。
- 函数调用与本地变量和已通过的函数参数一起装入这里 。
- 当程序超出范围时,空间会自动释放。
- 存储在相继内存中 。
堆肥
- 与Stack相比,Stack的准入速度缓慢。
- 存储在记录和档案管理中。
- 动态创建的变量存储在这里, 以后需要使用后释放分配的内存 。
- 存储到记忆分配的地方 指示器总是能存取
有趣的是:
- 如果功能电话储存在堆积中,就会造成两点混乱:
- 由于在堆叠中相继存储, 执行速度会更快。 堆积中的堆积会导致大量时间消耗, 从而使整个程序的执行速度放慢 。
- 如果将功能储存在堆积中(指针指向的沉降器),就不可能返回调用地址(堆叠是由于内存的顺序存储而提供的) 。
(我将这一答案从另一个或多或少是这个问题的假象的问题移出。 )
您问题的答案是具体执行问题,可能因汇编者和处理结构而异。但这里是简单的解释。
- 堆叠和堆叠都是从基本操作系统分配的记忆区(通常是虚拟内存,按要求绘制成物理内存)。
- 在一个多轨环境中, 每条线将拥有自己的完全独立的堆叠, 但是它们会共享堆叠 。 同时访问必须控制在堆叠上, 无法在堆叠上 。
堆积物
- 堆积中包含一个链接的旧区块和空空区块列表。
new
或malloc
)通过在自由区块中创建一个合适的区块来满足。这需要更新堆积层上的区块清单。元数据信息堆积物层的区块 也常储存在堆积物层上 在一个小区域 就在每个块块的前面 - 随着堆积增加,新区块往往从下层地址分配到更高的地址。堆肥内存区块的大小随内存分配而增大。如果堆积太小,无法分配,则从基本操作系统获取更多的内存,其内存量往往会增加。
- 分配和分配许多小区块可能会让堆积物离开堆积物的状态下,在用过的区块之间有许许多多的小型自由区块。 分配大区块的请求可能会失败,因为没有一块自由区块能够满足分配要求,即使自由区块的组合体大小可能足够大。 这被称为“无自由区块 ” 。堆积碎裂.
- 当使用过的自由区块旁边的块块在交易时,新的自由区块可以与邻近的自由区块合并,以创建一个更大的自由区块,有效地减少堆积的碎裂。
堆叠
- 堆叠工作通常与一个名为CPU的特别登记簿密切配合进行。堆叠指针。最初,堆叠指针指向堆叠的顶部(堆叠上的最高地址)。
- CPU有特别指示推推堆叠和弹出弹出从堆放堆放的堆放物中推进保存堆叠指针当前位置的值,并减少堆叠指针。 A弹出检索堆叠指针指向的值,然后增加堆叠指针(不要被以下事实混淆):添加堆叠的值减少堆叠指针和删除删除a 值增加数保存并检索的值是 CPU 登记册的值。
- 如果函数有参数,则这些参数在调用到函数之前被推到堆栈上。然后,函数中的代码能够从当前的堆叠指针上导航堆栈以定位这些值。
- 当函数被命名为 CPU 时, 函数会使用特殊指令来按当前指示指示器后,当函数返回时,旧的指令指针会从堆叠中跳下来,然后在调用该函数后,在代码中恢复执行。
- 当输入一个函数时,会降低堆叠指针,以便在堆栈上为本地(自动)变量分配更多空间。如果函数有一个本地32位变量,则在堆栈上留出四个字节。当函数返回时,会将堆叠指针移回所分配的区域。
- 括号函数调用功能像一个护符一样工作。 每一个新调用功能参数、 返回地址和本地变量空间, 以及这些变量激活记录可以堆放嵌套电话,函数返回时会以正确的方式卸载。
- 由于堆叠是一个有限的内存块块, 您可以引起堆叠溢溢溢通过调用过多的嵌套函数和/ 或为本地变量分配过多的空间。 堆栈使用的记忆区域通常设置在堆栈底部( 最低地址) 下方的刻录将触发CPU的陷阱或例外。 此特殊条件随后会被运行时间捕获, 并转换成某种堆叠溢出例外 。
能否在堆叠上而不是堆叠上分配函数 ?
否,函数(即本地变量或自动变量)的激活记录被分配到堆叠上,不仅用于存储这些变量,还用于跟踪嵌套功能电话。
如何管理堆肥实际上要到运行时的环境。 C 使用malloc
C++ 和C++ 用途new
,但许多其他语言都有垃圾收集。
然而,堆叠是一个更低层次的特性,它与处理器结构紧密相连。 当没有足够的空间时堆积起来不会太难, 因为可以在处理堆积的图书馆电话中执行。 但是, 堆叠堆积起来往往是不可能的, 因为堆积溢出的时间太晚才被发现; 关闭行刑线是唯一可行的选择。