• 什么是堆叠和堆叠?
  • 他们在电脑记忆中身处何方?
  • 它们在多大程度上受到操作系统或语言运行时间的控制?
  • 其范围是什么?
  • 是什么决定了它们的大小?
  • 是什么让一个更快?

当前回答

因为有些答案没有被选中,所以我会贡献我的力量。

令人惊讶的是,没有人提到,不仅在外来语言(邮政(邮政)或平台(英特机Itium)中,而且在互联网上,都能找到多个(即与运行的OS级别线索数量无关)调呼堆叠(即与运行的OS级别线索数量无关)纤维纤维, 绿线以及一些执行《公约》和《公约》共管.

纤维、绿线和合金在许多方面都相似,导致许多混乱。 纤维和绿线之间的区别在于前者使用合作性多任务,而后者可能具有合作性或先发制人(甚至两者兼而有之)的特点。 关于纤维和合金之间的区别,请参看在这里.

无论如何,两种纤维、绿线和共程的目的都具有同时执行的多重功能,但是,平行平行(见这个问题在一个OS级线内,以有组织的方式将控制权相互交替转移。

当使用纤维、绿线或合金时,你通常通常每个函数都有单独的堆叠 。 (在技术上, 不只是堆叠, 而整个执行环境是每个函数。 最重要的是, CPU 注册 。) 对于每串线索, 都有与同时运行的函数一样多的堆叠, 并且线索正在根据程序逻辑执行每个函数之间切换。 当一个函数运行到尾端时, 它的堆叠会被销毁 。 因此,堆叠的数量和寿命是动态的,并且不取决于操作系统级别线索的数量 !

请注意,我说过: "通常通常每个函数有一个单独的堆叠。堆叠无文最引人注意的堆叠式C++的C++实施软 软 软 软 软 体微软 PPPL数(_S)async/await。 (然而, C++'s可恢复功能(a.k.a. " )asyncawait" (C++17提案,可能使用无堆叠的共程。 )

C++标准图书馆的Fibers提案即将提出。还有第三方。图书馆图书馆绿色线在Python和Ruby等语言中极为流行。

其他回答

OK,OK, OK, OK, OK, OK, OK, OK, OK,OK, OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,OK,简言简简短地说,它们的意思是:已订购未排序...!

堆堆叠:在堆叠的物品中,事情会相互占据顶端, 意味着处理的速度会更快,效率会更高!

所以总是有一个索引来指向特定项目, 处理速度也会更快, 这些项目之间也有关系!

堆肥:没有订单,处理速度会放慢, 价值会混乱在一起,没有具体的订单或索引... ......有随机的,它们之间没有关系... 所以执行和使用时间可以不同...

我还创造了下面的图像,以显示他们可能长得如何:

enter image description here

在下面的 C# 代码中

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

下面是内存管理的方法

Picture of variables on the stack

Local Variables只需在堆叠中进行函数调用, 就会持续多久。 堆放堆放的堆放量用于那些我们一生中并不真正了解的变量, 但是我们期望它们会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆放堆放中, 就必须知道它有多大 。

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

在 Java 中, 大多数对象都直接进入堆肥中。 在 C / C++ 等语言中, 支架和类通常可以在不与指针打交道时留在堆叠中 。

更多信息,请访问以下网站:

Timmurphy. org 表示堆叠和堆积记忆分配的差别。

此处 :

在堆叠和堆放上创建对象

本条是上述情况的来源:6个重要的.NET概念:堆叠、堆积、价值类型、参考类型、拳击和拆箱-代码项目

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

其他人对大中风的反应也很好, 所以我要讲一些细节。

  1. 堆放和堆放不需要是单数的 。 堆放和堆放的多处常见情况是, 您在一个过程中拥有多个线条。 在此情况下, 每个线条都有自己的堆放。 您也可以有多个堆放。 例如, 某些 DLL 配置可能导致不同堆放的 DLL 分配不同的 DLL , 这就是为什么释放不同图书馆分配的内存通常是一个坏主意 。

  2. 在 C 中,您可以通过使用单花,它分配在堆叠上,而不是 Alloc,它分配在堆肥上。这个记忆不会保存在您的返回语句中,但它对刮痕缓冲很有用。

  3. 在 Windows 上做一个不使用很多内容的大型临时缓冲区不是免费的。 这是因为编译器将生成一个堆叠探测器循环, 每次输入您的函数时都会被调用, 以确保堆叠存在( 因为 Windows在堆叠的末尾使用一个单个的守护页面来检测堆叠的生长需要。 如果您访问堆叠尾端的多页内存, 您将会崩溃 ) 。 例如 :

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

我想许多其他人 已经给了你 大多是正确的答案 这个问题。

然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。

它们在哪里? 它们在哪里? (在真实的电脑记忆中)

回答: 两者都在记录和档案调控系统。

分会 :

内存就像一个书桌, HDDs/ SSDs( 永久存储) 像书架一样。 要阅读任何东西, 您必须在桌上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您必须把它从书架上拉出来, 然后在桌子上打开。 要退回一本书, 您必须关闭桌上的书架, 然后把它归还到书架上 。

堆积和堆积是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即记录和档案管理)。

其范围是什么?
是什么决定了每个孩子的大小?
是什么让一个更快?

回答:

  1. 堆叠为静态(固定大小)数据

    a 。编译者在编译时读取代码中使用的变量类型。

    (一) 为这些变量分配固定数量的内存。
    二. 此记忆的大小无法增长 。

    b. b. 数据内存是毗连的( 单个区块) , 所以访问是 有时有时 比堆积速度快

    c. 用于以下目的:放置在堆叠堆叠上的一个物体,该物体在超过堆叠大小的运行时会生成内存,导致 堆堆堆堆堆溢溢溢出错误

  2. 堆肥用于动态(变化大小)数据

    a 。内存量仅受内存存储器可用空空空间数量的限制
    (一) 使用的数量在运行时可按需要增长或缩减。

    b. b. 数据由于项目在堆积上分配,只要在内存记录和档案记录室中存在空空空间,数据并不总是在毗连部分中,而 有时有时 访问比堆叠慢

    c. 用于以下目的:程序手动将项目与newkeyword 和 Must 手动移动此内存, 当它们使用它完成后 。
    一. 重复分配新内存的代码,在不再需要新内存时,不将新内存分配到内存泄漏。

分会 :

堆叠和堆积堆肥主要不是为了提高速度而引入;它们被引入是为了处理内存溢出。关于堆叠与堆积之间的第一个关注点应该是是否会出现内存溢出。如果一个对象打算将大小扩大为未知数量(如链接列表或其成员可以持有任意数量数据的对象),则将其放置在堆积上。尽可能使用 C++ 标准库(STL) 容器。矢量, 地图图图图地图, 和列表列表因为它们是记忆和速度效率高的,并增加使你的生活更加轻松(你不必担心记忆分配/迁移)。

在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后返回并重新构思您的代码, 并查看它是否能够更有效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 I/ O 对 CPU 的任务, 也许添加多读或多处理 ) 。

我说有时有时速度较慢/ 较快, 因为程序的速度可能与堆叠或堆叠上分配的项目无关 。

它们在多大程度上受到操作系统或语言运行时间的控制?

回答:

  • 堆叠大小由汇编者在汇编时确定。

  • 在运行期间,堆积大小各有不同。 (堆积在运行时与操作系统一起工作,以分配内存。)

分会 :

以下是更多关于控制和编译时间与运行时间操作的更多信息。

每台电脑都有独特的指令设置结构(ISA),即其硬件指令(例如“MOVE”、“JUMP”、“ADD”等)。

  • 操作系统只不过是一个资源管理者(控制如何/何时/和何处使用内存、处理器、装置和信息)。

  • 安全操作系统的ISA被称为光机其余命令被命名为扩展机内核是扩展机器的第一层。 它控制着类似

    • 确定要使用处理器(调度器)的任务,
    • 分配给任务(调度员)的内存多少或硬件登记册多少,以及
    • 执行任务的顺序(交通控制器)。
  • 当我们说“编译者”时,我们通常是指编译者、组装者和链接者在一起

    • 编译者将源代码转换为组装语言,并将其传给装配者,
    • 装配器将装配语言转换成机码(ISA命令),并传给链接器
    • 链接器将所有机器代码( 可能来自多个源文件) 合并成一个程序 。
  • 机器代码在被执行时传递到内核, 由内核决定它何时应该运行并控制, 但机器代码本身包含ISA命令, 用于请求文件, 请求内存等。 所以代码发布 ISA 命令, 但一切都要通过内核 。