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


当前回答

许多答案作为概念是正确的,但我们必须指出,硬件(即微处理器)需要堆叠,才能调用子例程(用组装语言调用)。 (oop guys will call it ways)

在您保存返回地址的堆栈上, 并拨“ 推 / 重 ” Pop 由硬件直接管理 。

您可以使用堆叠来设定通过参数。 即使比使用登记册要慢( 微处理器大师会说, 或者好的 1980 年代生物书...) )

没有堆叠, 没有微处理器是行不通的。 (我们无法想象一个程序, 即使是在组装语言中, 没有子例程/功能) 没有它能工作的堆肥( 组装语言程序可以工作, 因为堆肥是一个 os 概念, 作为 malloc, 是一个 os/lib调用 ) 。

堆栈使用速度更快, 以 :

硬体是硬件,甚至推/棒也非常有效。 中转器需要输入内核模式,使用锁/石墨(或其他同步原始元素)执行某些代码,并管理一些跟踪分配情况所需的结构。

其他回答

我有一些要分享的,虽然主要要点已经涵盖在内。

堆叠堆叠

快速访问。 存储在 rap 中。 函数调用会与本地变量和函数参数一起装入这里。 当程序退出范围时, 空间会自动释放。 存储在连续内存中 。

堆肥

相对于堆叠的存取速度较慢。 储存在堆叠中。 动态生成的变量存储在这里, 以后需要使用后释放分配的内存 。 保存在存储分配处, 指示器总是访问 。

有意思的注意:

如果功能电话被储存在堆叠中,就会造成两个混乱点:由于堆叠中顺序存储,执行速度更快。 堆积中储存会导致大量时间消耗,从而使整个程序的执行速度放慢。 如果功能被储存在堆积中(指针指向的混凝土存储器),就不可能返回调用地址(由于堆叠中顺序存储内存而导致堆叠) 。

堆栈是作为执行线条的抓抓空间预留的内存。当函数被调用时,在堆栈顶部为本地变量和一些簿记数据预留一个区块。当该函数返回时,块就会被未使用,下次调用函数时就可以使用。堆栈总是保留在利弗(最先出)顺序中;最近保留的区块总是下一个要解开的区块。这样就可以很容易地跟踪堆叠; fr 。

堆积是用于动态分配的内存。 与堆叠不同, 堆积区块的分配和分配没有强制模式; 您可以随时分配块块, 并随时释放它。 这使得跟踪堆积中哪些部分在任何特定时间分配或免费更为复杂; 许多定制的堆积分配器可用于调和不同使用模式的堆积性能 。

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

直接回答你的问题:

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

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

其范围是什么?

堆栈附在线条上,因此当线条退出时,堆栈被回收。堆积通常在运行时在应用程序启动时分配,在应用程序(技术处理)退出时再回收。

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

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

是什么让一个更快?

堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存( 指针/ 内插器只是递增或衰减) 变得微不足道, 而堆叠在分配或交易位置上有复杂得多的簿记。 另外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 从而非常快。 堆积的另一个性能冲击是堆积, 主要是全球资源, 通常是 h 。

清晰的演示:图像来源: vikashazrati.wordpress.com

短短

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


详细详细

堆叠堆叠

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

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

在此可以找到更多 。


堆积物,

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

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

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

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

在此可以找到更多 。


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

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

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

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

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

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

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


现在来回答你的问题吧

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

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

在此可以找到更多 。

其范围是什么?

已经在上方给定 。

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

在此可以找到更多 。

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

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

是什么让一个更快?

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

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

在此可以找到细节 。

其他人对大中风的反应也很好, 所以我要说几个细节。

堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。

void myfunction()
{
   char big[10000000];
   // Do something that only uses for first 1K of big 99% of the time.
}

20世纪80年代,Unix像兔子一样传播,大公司自己滚动。 Exxon拥有一个,历史也失去了数十个品牌。 许多执行者都决定如何留下记忆。

典型的 c 程序在记忆中平坦,有机会通过改变 brk () 值来增加。 典型的情况是, 堆积量略低于这个 brk 值, 增加 brk 增加了可用堆积量 。

单堆叠一般是堆积层下的一个区域, 它是一个内存的块块, 在下一个固定的内存区块的顶部之前, 没有任何价值。 下一个块块通常是代码, 在其时代著名的黑客之一的堆叠数据中, 可能被堆叠数据覆盖 。

一个典型的内存区块是 bss (一个零值块) , 在一个制造商的报价中, 意外没有零。 另一个是包含初始值的数据, 包括字符串和数字。 第三个是包含 Crt( cruntime) 、 主机、 函数和图书馆的代码 。

虚拟内存在 unix 中出现 。 许多限制 。 这些区块需要毗连, 或固定大小, 或现在订购特定方式, 没有客观的理由 。 当然, unix 之前的多立方体没有受到这些限制的影响 。 下面是一张图表, 显示这个时代的记忆布局 。