gpt4 book ai didi

memory - 为什么内存要分成栈和堆?

转载 作者:IT王子 更新时间:2023-10-28 23:28:45 25 4
gpt4 key购买 nike

Possible Duplicate:
What and where are the stack and heap

我有几个关于堆栈与堆的问题。

要知道的基本知识是堆栈比堆快,但有限制。 (如果我错了,请纠正我)。

但是,我一直想知道堆栈和堆究竟是如何工作的。 RAM只是一 block 内存,它不分为“堆栈”和“堆”(或者是吗?)。如果是这样,为什么我们首先要在堆栈和堆中拆分内存?

操作系统可以让我们能够分配堆栈上的所有内容 -> 一切都变得更快 -> 快乐的世界?

我很确定情况并非如此。但为什么!?谁能给我一个深入的答案?

对不起,如果这篇文章是某个人曾经发布过的某个帖子的副本,那么与堆栈和堆相关的内容太多了,我找不到确切的问题。如果您碰巧知道一个,请继续链接它。

最佳答案

堆栈:堆栈用作一种临时暂存器,供当前正在执行的代码块使用,任何 block 称为当前代码块,以及任何 block 称为该代码块,并且很快。当当前 block 退出时,它使用的局部变量被遗忘。顾名思义,堆栈以后进先出的方式使用。

堆栈最重要的用途之一是跟踪当前的调用链。当一个函数调用另一个函数时,调用者将下一条指令的地址(返回地址)压入堆栈。当每个函数退出时,它将调用者的返回地址从堆栈中弹出,并继续执行从该地址开始的代码。它还用于在调用者和被调用者之间传递函数参数和返回值。

堆:堆是不同的——它没有特定的顺序。如果你想在一个代码块中分配内存并且让那个内存粘在 block 的末尾之外,你可以在堆上分配它。当然,您还需要在某处存储指向它的指针/引用,以便其他代码可以找到该内存;大多数语言都为此提供了便利。

速度:速度差异不是由于内存本身的任何属性 - 正如您在问题中所说,堆栈和堆通常都位于相同的物理内存中。由于堆栈的 LIFO 特性,在堆栈上分配空间很快:如果您将某些东西插入堆栈,它只能在一个位置结束。相比之下,在堆上分配 block 需要在内存中找到足够大的连续空闲区域。堆栈分配可以像一条指令一样快;堆分配需要调用像 malloc() 这样的内存分配函数。

静态v.动态 在堆上分配内存是动态的——是否分配 block , block 的大小,可以根据程序在运行时接收到的输入来确定。如果需要,甚至可以调整堆上分配的内存区域的大小。 也可以在堆栈上动态分配内存(参见 C 标准库函数 alloca()),但是一旦当前函数退出,该内存就会丢失.堆栈分配通常是静态的——编译器确定(非寄存器)参数、返回数据和局部变量需要多少空间,并在调用函数时生成代码以在堆栈上保留必要的空间。

示例:假设您正在创建一个文字处理器。您无法提前知道文档有多大,甚至无法知道同时使用多少文档。同时,您希望用户的文档保留在内存中,只要用户希望它们保持打开状态。如果您尝试为堆栈上的文档分配内存,您会发现很难同时打开多个文档,您需要创建一个函数来创建、编辑、保存和关闭文档。在堆上分配空间允许您创建任意数量的文档,每个文档的大小都适合其包含的数据,并避免将文档的生命周期与任何特定函数的生命周期联系起来。

总结:简而言之,堆栈保存变量的值(有时使用寄存器代替),而堆用于分配将在当前 block 的生命周期之后使用的内存.

关于memory - 为什么内存要分成栈和堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com