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

当前回答

在下面的 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概念:堆叠、堆积、价值类型、参考类型、拳击和拆箱-代码项目

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

其他回答

CPU堆和堆肥与CPU和登记簿如何与记忆工作、机器组合语言如何运作、而不是高层次语言本身有实际联系,即使这些语言能决定小事。

所有现代CPU都与“相同”微处理理论合作: 它们都基于所谓的“ 注册者” 和一些“ 堆叠” 来取得性能。 所有 CPU 从一开始就有堆叠登记簿, 并且他们总是在这里, 正如我所知。 议会语言从一开始就是相同的, 尽管有各种变化... 直到微软及其中间语言(IL) 改变了范式, 有了OO虚拟机组装语言。 因此, 我们将来可以有一些 CLI/ CIL CPU (一个MS项目) 。

CPU有堆叠登记册来加速存取记忆,但与其他登记册相比,这些登记册有限,无法完全获取进程的所有可用内存。 这就是为什么我们谈论堆叠和堆积分配的原因。

简而言之,总的来说,堆积是慢慢的,用于“全球”实例和对象内容,因为堆叠的体积很小,速度很快,用于“本地”变量和参考(隐藏的指针要忘记管理它们)。

所以当我们用一种方法使用新关键字时, 引用( int) 是在堆叠中创建的, 但是对象及其所有内容( 价值类型以及对象) 都在堆积中创建, 如果我记得的话。 但是本地基本值类型和阵列是在堆叠中创建的 。

内存存存取的差别在于单元格参考级别:处理堆积,即整个过程的记忆,在处理CPU登记册方面要求比处理堆叠更为复杂,因为如果我记得,CPU堆叠登记册被用作基地址,因此,处理堆积存存存存取的差别就大于当地“更多”的堆叠。

这就是为什么当我们有非常长或无限的循环电话或循环时, 我们很快地被堆积物溢出, 而不冻结现代电脑上的系统...

C# Heap(ing) Vs Stack(ing) in.NET

Stack vs Heap: 了解差异

C# 储存的静态类内存分配

堆叠和堆放在哪里?

https://en.wikipedia.org/wiki/Memory_management

https://en.wikipedia.org/wiki/Stack_register

大会语文资源:

议会方案拟订教学

Intel 64和IA-32建筑软件开发者手册

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

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

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

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

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

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

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

在下面的 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概念:堆叠、堆积、价值类型、参考类型、拳击和拆箱-代码项目

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

几分钱:我想,画出内存图形和简单一些是件好事:

This is my vision of process memory construction with simplification for more easy understanding wht happening


箭头 - 显示生长堆叠和堆叠、流程堆叠大小的极限, 以 OS 定义, 通常由线条中的线状堆叠大小的参数来设定 API 。 厚通常通过进程限制最大虚拟内存大小, 例如32 位 2 - 4 GB 。

简单的方法就是简单的方法:过程堆叠对于过程和内部所有线条都是一般的, 用于记忆分配, 通常使用类似的方式中偏().

Stack 是常见情况下存储的快速内存, 用于存储函数返回指针和变量, 处理为函数调用参数, 本地函数变量 。

哇,这么多答案,我觉得其中的某个人搞错了...

1) 它们在哪里以及是什么(在真实的计算机记忆中)?

堆栈是作为分配给您的程序图像的最高内存地址开始的内存,然后从那里降低值。它保留给所谓的函数参数和函数中使用的所有临时变量。

有两层楼:公共楼和私人楼。

私人堆积从程序代码最后一字节之后的16字节边界( 64比特程序)或8比特边界( 32比特程序)开始,然后从中增加值。它也被称为默认堆积。

如果私家堆肥太大, 它会重叠堆叠区域, 堆叠如果太大, 堆叠也会重叠堆叠区域。 因为堆叠从一个更高的地址开始, 并一直往下移到更低的地址, 适当的黑客可以使堆叠变得如此大, 它会超过私家堆肥区域, 并重叠代码区域。 关键在于将代码区域重叠到足够大的地方, 从而可以连接到代码中。 这样做有点棘手, 你可能会冒程序崩溃的风险, 但是它很容易, 并且非常有效 。

公用堆积层位于您的程序图像空间以外的自己的记忆空间中。 如果记忆资源变得稀缺, 这个记忆将会被吸到硬盘上 。

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

堆叠由程序员控制,私人堆积由操作系统管理,公众堆积不为任何人控制,因为它是一种操作系统服务 -- -- 你提出请求,它们要么被批准,要么被拒绝。

2(b) 其范围是什么?

它们都是全球性的,但内容可以是私人的,公共的,也可以是全球性的。

2(c) 由什么因素决定其中每一方的大小?

堆叠和私有堆放的大小由您的编译器运行时间选项决定。公共堆放使用大小参数在运行时初始化。

2(d) 是什么使一个速度更快?

程序程序员如何使用它们来决定它们是“快”还是“慢”

俄联邦:

https://norasandler.com/2019/02/18/Write-a-Compiler-10.html

https://learn.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-getprocessheap

https://learn.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-heapcreate