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

当前回答

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

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

其他回答

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

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

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

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

您可以用堆叠做一些有趣的事情。 例如, 您的函数像单花(假设你能够通过有关其使用的大量警告) 这是一种专门用堆叠而不是堆叠来记忆的 中转器形式。

也就是说, 堆叠式的记忆错误是我经历过的最糟糕的记忆错误。 如果您使用堆积式内存, 并超越了分配区块的界限, 您就有一个很好的机会触发断段断层断层。 ( 不是100%: 您的区块可能附带地与先前分配的区块毗连 。 ) 但是由于堆叠上创建的变量总是相互连结, 边框中的写法可以改变另一个变量的值。 我了解到, 只要我感到我的程序不再遵守逻辑法则, 它可能就是缓冲溢出 。

当在加载代码和数据操作系统设置后创建一个进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 程序在装入代码和数据操作系统设置后启动堆放

当需要更多堆积时, OSS 将动态分配, 堆积块总是几乎毗连

请参看请见brk(), sbrk()alloca()系统在 Linux 中调用

堆堆叠

  • 非常快速接入
  • 不必明确排除可变变量
  • 由CPU有效管理空间,内存不会分散
  • 仅本地变量
  • 对堆叠大小的限制(取决于OS)
  • 变量无法调整大小

堆肥

  • 可在全球范围内访问变量
  • 内存大小无限制
  • (相对)获取较慢
  • 没有保证有效使用空间的保证,随着时间推移,记忆可能会变得支离破碎,因为分配了记忆区块,然后释放了
  • 您必须管理内存( 您负责分配和释放变量) 。
  • 可使用 elloc () 调整变量大小

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

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

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

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

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

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

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