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


当前回答

什么是堆叠?

堆叠是一堆物体, 通常是排列整齐的物体。

计算架构中的堆栈是内存区域, 数据以最先出错的方式被添加或删除。 在多行应用程序中, 每串线索将有自己的堆栈 。

什么是堆积物?

堆积成堆的堆积物, 堆积成堆。

在计算结构中,堆积是一个动态分配的内存区域,由操作系统或内存管理库自动管理。 堆积上的内存在程序执行期间被分配、 分配和定期调整, 这可能导致一个叫做碎裂的问题。 当内存物体在小空格中被分配时, 碎片就会发生, 这些空格太小, 无法持有额外的内存对象。 净结果为堆积垃圾邮件的百分比 。

两者加在一起

在一个多行应用程序中, 每串线索都有自己的堆叠。 但是, 所有不同的线条都会共享堆积。 因为不同的线条在一个多行应用程序中共享堆积, 这还意味着线条之间必须有一些协调, 以便它们不会试图同时访问和操作堆积中的同一块内存 。

这是更快的--堆叠还是堆叠?为什么?

堆栈比堆叠要快得多。 这是因为堆叠上的内存分配方式。 堆叠上的内存分配和堆叠指针向上移动一样简单 。

对于新到编程的人来说,使用堆叠可能是一个好主意,因为堆叠比较容易。 因为堆叠是小的, 当你确切知道数据需要多少内存, 或者知道数据大小非常小时, 你会想使用它。 当你知道数据需要大量内存的时候, 使用堆叠比较好, 或者你不确定你需要多少内存( 如动态阵列 ) 。

Java记忆模型

堆栈是存储本地变量(包括方法参数)的内存区域。当涉及到对象变量时,这些变量只是堆积中实际对象的引用(指针)。每当一个对象被即时化,就会留出一块堆积内存以保持该对象的数据(状态)。由于对象可以包含其他对象,有些数据实际上可以保留这些嵌套对象的引用。

其他回答

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

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

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

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

当调用函数时,当调用该函数的参数加上一些其他间接费用时,会将数据堆放到堆栈中。一些信息(例如返回何处)也存储在那里。当您在函数中声明变量时,该变量也会被分配到堆栈中。

分配堆栈非常简单, 因为您总是在分配的反向顺序中进行排列。 在输入函数时会添加堆叠材料, 当退出时相应的数据会被删除。 这意味着您往往会留在堆栈的狭小区域, 除非您调用许多函数来调用其他函数( 或者创建循环解决方案 ) 。

堆积堆是一个通用名称, 用于您将创建的数据放在哪里 。 如果您不知道您的程序将创建多少飞船, 您可能会使用新的( 或商场或等效的) 操作器来创建每艘飞船 。 此分配将会停留一段时间, 因此我们很可能释放的东西 以不同于我们创建的顺序 。

因此,堆积要复杂得多,因为最终会出现一些未使用的记忆区域,这些区域与块间断 — — 内存会变得支离破碎。 找到您需要的大小的自由记忆是一个困难的问题。 这就是为什么应该避免堆积( 尽管它仍然经常被使用 ) 。

执行堆叠和堆叠通常要到运行时间 / os. 通常游戏和其他功能对于性能至关重要的应用程序会创建自己的内存解决方案,从堆叠中抓取一大块内存,然后在内部将内存分离出来,以避免依赖 os 来进行内存。

只有当你的记忆用法与常规有很大不同时, 也就是在游戏中, 在一个巨大的操作中加载一个水平, 并且可以在另一个巨大的操作中将整个批量扔掉时, 这才是实际的。

内存中的物理位置比你想的要少, 这是因为一种叫做虚拟内存的技术, 它使得您的程序认为您可以进入某个地址, 物理数据在其他地方( 即使是在硬盘上!) 。 您获得的堆叠地址随着调用树越深, 顺序越大。 堆积的地址是无法预测的( 具体化) , 坦率地说并不重要 。

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建筑软件开发手册

短短

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


详细详细

堆叠堆叠

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

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

在此可以找到更多 。


堆积物,

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

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

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

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

在此可以找到更多 。


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

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

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

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

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

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

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


现在来回答你的问题吧

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

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

在此可以找到更多 。

其范围是什么?

已经在上方给定 。

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

在此可以找到更多 。

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

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

是什么让一个更快?

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

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

在此可以找到细节 。

a couple of cents: 我认为, 绘制内存图形比较简单, 将会是件好事 :

箭头 - 显示生长堆叠和堆肥的位置, 进程堆叠大小有限制, 以 os 定义, 以线状线条参数为线状堆叠大小限制通常创建 api 。 通常以进程最大虚拟内存大小为限制, 例如32 位 2-4 gb 。

如此简单的方式:过程堆积对于过程和内部所有线条来说都是一般的, 用于记忆分配, 常见的情况是像 malloc () 。

堆栈是用于存储常见函数返回指针和变量的快速存储存储存储的快速内存, 被处理为函数调用中的参数, 本地函数变量 。