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


当前回答

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

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

其他回答

cpu 堆和堆积与堆积与堆积与堆积与堆积与堆积之间,

所有现代的 cpus 都与“ 相同” 微处理理论合作: 它们都基于所谓的“ 注册者” 和一些“ 堆叠” 来取得性能。 所有 cpus 从一开始就有堆叠登记簿, 他们总是在这里, 说话的方式,如我所知。 组装语言从一开始就是相同的, 尽管从一开始, 直到... 微软和中间语言( i) 都改变了范式, 有了一种 oo 虚拟机组装语言。 这样我们就可以有一些 cli/ cil 。

cpus有堆叠登记册来加快存取记忆的速度,但与其他登记册相比,这些登记册是有限的,以充分利用所有可用于处理过程的存储器。 这就是为什么我们谈论堆叠和堆积分配的原因。

简而言之,一般而言,堆积是慢慢的,用于“全球”实例和对象内容,因为堆叠小而快,用于“本地”变量和参考(隐藏的指针要忘记管理这些变量和参考)。

所以当我们在一个方法中使用新关键字时, 引用( int) 是在堆叠中创建的, 但是对象及其全部内容( 价值类型以及对象) 都在堆积中创建, 如果我记得的话。 但是本地基本值类型和阵列是在堆叠中创建的 。

内存存存取的差别在于单元格的参考级别:处理堆积,即整个过程的记忆,在处理 cpu 登记册方面要求比处理当地“更多” 的堆叠更为复杂,因为如果我记得, cpu 堆积登记册被用作基地址。

这就是为什么当我们有非常长或无限的循环电话或循环时, 我们很快地被堆积物溢出, 而不冻结现代电脑上的系统...

cheap(ing) 与. net 中的堆叠(ing) 。

堆堆堆和堆堆:知道差别

储存的静态类内存分配c

堆叠和堆放在哪里?

https://en.wikipedia.org/wiki/Memory_management

https://en.wikipedia.org/wiki/Stack_register

功率语言资源:

组组编程辅导

64和ia-32建筑软件开发手册

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

源源代码:academinide

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

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

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

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

(我将这一答案从另一个或多或少是本问题的代名词的问题移出。 )

您问题的答案是具体执行问题,可能因汇编者和处理结构而异。然而,这里是简单的解释。

堆叠和堆积都是从基本操作系统分配的内存区域(通常是虚拟内存,根据需要绘制成物理内存)。 在多轨环境中,每条线将有自己的完全独立的堆叠,但他们将共享堆叠。同时存取必须控制在堆积上,不可能在堆叠上。

堆积物,

堆积中含有一个用过的和自由的区块的链接列表。 堆积( 由新的或中转的) 上的新分配通过从一个自由区块中创建一个合适的区块来满足。 这需要更新堆积中的区块清单。 堆积中的区块的元信息也通常储存在堆积中, 保存在每个区块前面的小区域中。 当堆积中的新区块往往从下面的地址分配到更高的地址。 因此, 您可以将堆积视为一个堆积 o 。

堆叠堆叠

堆叠通常与名为堆叠指针的 cupu 上的特殊登记簿密切配合。 最初, 堆叠指针指向堆叠的顶部( 堆叠上的最高地址 ) 。 堆叠有将值推到堆叠上并将其从堆叠中弹出的特殊指令。 每一次推移都存储在堆叠指针当前位置的值, 并减少堆叠指针。 流行会检索堆叠指针指向的值, 然后增加堆叠指针( 不要) 。

能否在堆叠上而不是堆叠上分配函数 ?

否,函数(即本地变量或自动变量)的激活记录在堆栈上分配,不仅用于存储这些变量,还用于跟踪嵌套功能电话。

如何管理堆肥真的取决于运行时间环境。 c 使用中转器, c++ 使用新的, 但很多其他语言都有垃圾收集 。

然而,堆叠是一个更低层次的特征,它与处理器结构紧密相连。 当没有足够的空间时, 堆叠会生长成堆不会太难, 因为可以在处理堆叠的图书馆电话中执行。 然而, 堆叠的堆叠往往不可能增长, 因为堆叠溢出的时间太晚才被发现; 关闭行刑线是唯一可行的选择。

堆栈是内存的一部分,可以通过若干关键组装语言指令来操作,例如“pop”(从堆叠中移动并返回一个值)和“push”(将一个值推到堆叠中),但也可以调用(调用子例程 - 将地址推到堆叠中)和返回( 从子例程返回 - 将堆叠的地址从堆叠中跳出并跳到堆叠中)。这是堆叠指针登记册下方的内存区域,可以根据需要设置。堆叠也用于 pa 。

堆积是操作系统向一个应用程序提供的内存的一部分, 通常通过像马洛克这样的音响。 在现代套管上, 这个内存是一组只有呼叫程序才能进入的页面 。

堆叠的大小在运行时确定, 一般在程序启动后不会增长。 在 c 程序中, 堆叠需要足够大, 以保持每个函数中所有声明的变量。 堆叠会按需要动态增长, 但 巨头最终会发出呼唤( 它会增加的堆积量通常超过 merloc 要求的值, 这样至少有些未来的中枢不需要返回内核来获取更多的内核内存 。 此行为通常可以自定义 )

因为您在启动程序前已经分配了堆叠, 所以在您使用堆叠之前, 您从不需要在使用堆叠前使用滚动, 所以在实际操作中这是一个小的优势。 实际上, 很难预测什么是快速的,什么是缓慢的, 在拥有虚拟内存子系统的现代操作系统中, 因为这些页面是如何被安装的, 在哪里存储的, 是一个执行细节 。