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


当前回答

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

其他回答

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

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

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

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

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

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

直接回答你的问题:

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

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

其范围是什么?

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

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

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

是什么让一个更快?

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

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

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

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

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

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

堆栈使用速度更快, 以 :

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

在以下 c 代码中

public void Method1()
{
    int i = 4;
    int y = 2;
    class1 cls1 = new class1();
}

下面是内存的管理方式

本地变量只要在堆栈中进行函数调用, 只需持续时间。 堆积层的堆积层用于那些我们并不真正了解其一生的变量, 但是我们期望这些变量会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆叠中的话 。

对象(在更新时大小不同) 继续堆积, 因为我们不知道在创建时它们会持续多久。 在许多语言中, 堆积是垃圾, 以寻找不再有任何引用的对象( 如 cls1 对象) 。

在 java 中, 大多数对象会直接进入堆积。 以 c / c++、 structs 和 class 等语言, 当您不与指针打交道时, 通常会留在堆叠中 。

更多信息,请访问 :

堆叠和堆积内存分配的差别 Timmurphy.org

此处 :

在堆叠和堆放上创建对象

本条是上述图象的来源:六种重要的.net概念:堆叠、堆肥、价值类型、参考类型、拳击和开箱-代码项目

但要知道它可能含有一些不准确之处。

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

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

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

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