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


当前回答

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

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

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

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

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

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

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

其他回答

短短

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


详细详细

堆叠堆叠

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

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

在此可以找到更多 。


堆积物,

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

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

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

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

在此可以找到更多 。


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

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

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

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

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

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

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


现在来回答你的问题吧

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

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

在此可以找到更多 。

其范围是什么?

已经在上方给定 。

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

在此可以找到更多 。

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

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

是什么让一个更快?

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

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

在此可以找到细节 。

您可以用堆叠做一些有趣的事情。例如,您有像 Alloca(假设您能够通过关于堆叠使用的大量警告)这样的功能,这是一种形式的中转器,专门用堆叠而不是堆叠来记忆。

也就是说,基于堆叠的内存错误是我经历过的最糟糕的内存错误。 如果您使用堆积内存, 并且越过分配区块的界限, 您有触发断段故障的好机会 。 ( 不是100%: 您的区块可能附带地与先前分配的区块相毗连 。) 但是由于堆叠上创建的变量总是相互连结, 写出边框可以改变另一个变量的值 。 我了解到, 只要我感觉到, 只要我感觉到它, 就会改变另一个变量的值 。

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

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

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

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

其他人直接回答了您的问题, 但是当试图理解堆叠和堆积时, 我认为考虑传统的 unix 进程( 没有线条和基于 mmap () 的缩放符) 的内存布局( 没有线条和 mmap () 的缩放符 ) 。 内存管理词汇表网页有一张内存布局图 。

堆叠和堆肥传统上位于进程虚拟地址空间的对面。 堆叠在存取时自动增长, 以内核设定的大小( 内核可以使用设置限制( rlimit_ stack,...) 调整) 。 当内存分配器引用 brk () 或 sbrk () 系统调用时, 堆叠会增长, 将更多页的物理内存映入进程的虚拟地址空间 。

在没有虚拟内存的系统中,例如一些嵌入系统,通常适用同样的基本布局,但堆叠和堆积大小固定。然而,在其他嵌入系统中(例如基于微芯片的微控制器),程序堆叠是一个单独的内存块,无法通过数据移动指示处理,只能通过程序流指示(调用、返回等)进行间接修改或阅读。

什么是堆叠?

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

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

什么是堆积物?

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

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

两者加在一起

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

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

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

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

Java记忆模型

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