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

当前回答

堆叠是作为执行线索的抓抓空间预留的内存。 当调用函数时, 在堆叠顶部保留一个区块, 用于本地变量和一些簿记数据。 当该函数返回时, 块会被未使用, 下次调用函数时可以使用。 堆叠总是保留在 LIFO 的顺序中( 最后一个在第一个出处) ; 最近保留的区块总是要解开的下一个区块 。 这样可以非常简单地跟踪堆叠; 从堆叠中释放一个区块只不过是调整一个指针而已 。

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

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

直接回答你的问题:

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

当线索创建时, OS 会为每个系统级线索分配书架。 通常情况下, OS 会被语言运行时间调用来分配应用程序的堆积 。

其范围是什么?

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

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

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

是什么让一个更快?

堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存变得微不足道( 指针/ 内插器仅仅是递增或衰减) , 而堆叠在分配或交易地点的簿记上复杂得多 。 此外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 使其速度非常快 。 堆积的另一个性能冲击是, 堆积( 大多是一个全球资源) , 通常必须是多读的安全性, 也就是说, 每一个分配和交易地点需要 — 通常 — 与程序中的“ 所有” 其它堆积权限同步 。

明确表明:
图像来源 :vikashazrati.wordpress.com 译者注:

其他回答

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

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

堆叠是作为执行线索的抓抓空间预留的内存。 当调用函数时, 在堆叠顶部保留一个区块, 用于本地变量和一些簿记数据。 当该函数返回时, 块会被未使用, 下次调用函数时可以使用。 堆叠总是保留在 LIFO 的顺序中( 最后一个在第一个出处) ; 最近保留的区块总是要解开的下一个区块 。 这样可以非常简单地跟踪堆叠; 从堆叠中释放一个区块只不过是调整一个指针而已 。

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

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

直接回答你的问题:

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

当线索创建时, OS 会为每个系统级线索分配书架。 通常情况下, OS 会被语言运行时间调用来分配应用程序的堆积 。

其范围是什么?

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

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

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

是什么让一个更快?

堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存变得微不足道( 指针/ 内插器仅仅是递增或衰减) , 而堆叠在分配或交易地点的簿记上复杂得多 。 此外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 使其速度非常快 。 堆积的另一个性能冲击是, 堆积( 大多是一个全球资源) , 通常必须是多读的安全性, 也就是说, 每一个分配和交易地点需要 — 通常 — 与程序中的“ 所有” 其它堆积权限同步 。

明确表明:
图像来源 :vikashazrati.wordpress.com 译者注:

堆叠 :

  • 存储在计算机内存中 就像堆积物一样
  • 堆叠上创建的变量将超出范围, 自动进行交易 。
  • 与堆积上的变量相比,分配速度要快得多。
  • 采用实际的堆叠数据结构。
  • 存储本地数据, 返回地址, 用于通过参数 。
  • 当堆叠使用过多时(大部分来自无限重现或过深重重循环,分配量很大), 堆叠就会溢出。
  • 在堆栈上创建的数据可以不用指针使用 。
  • 如果您确切知道在编译时间之前需要分配多少数据, 并且数据并不太大, 您就会使用堆叠 。
  • 通常在程序启动时已经确定了最大尺寸 。

热量 :

  • 存储在计算机内存 和堆叠一样。
  • 在 C+++ 中, 堆积上的变量必须手动销毁, 并且绝对不能脱离范围。 数据以delete, delete[],或free.
  • 相对于堆叠上的变量, 较慢分配速度 。
  • 用于按需分配一组数据供程序使用。
  • 当有大量拨款和交易时,就有可能支离破碎。
  • 在C++ 或C++ 或C中,在堆积上生成的数据将用指针指出,并用newmalloc两者分别。
  • 如果要求分配的缓冲量太大,则可以造成分配失败。
  • 如果您不知道运行时需要多少数据, 或者需要分配大量数据, 您就会使用这种数据 。
  • 负责内存泄漏

示例:

int foo()
{
  char *pBuffer; //<--nothing allocated yet (excluding the pointer itself, which is allocated here on the stack).
  bool b = true; // Allocated on the stack.
  if(b)
  {
    //Create 500 bytes on the stack
    char buffer[500];

    //Create 500 bytes on the heap
    pBuffer = new char[500];

   }//<-- buffer is deallocated here, pBuffer is not
}//<--- oops there's a memory leak, I should have called delete[] pBuffer;

我有些话要说,尽管主要要点已经涵盖在内。

堆堆叠

  • 非常快速的进入。
  • 存储在记录和档案管理中。
  • 函数调用与本地变量和已通过的函数参数一起装入这里 。
  • 当程序超出范围时,空间会自动释放。
  • 存储在相继内存中 。

堆肥

  • 与Stack相比,Stack的准入速度缓慢。
  • 存储在记录和档案管理中。
  • 动态创建的变量存储在这里, 以后需要使用后释放分配的内存 。
  • 存储到记忆分配的地方 指示器总是能存取

有趣的是:

  • 如果功能电话储存在堆积中,就会造成两点混乱:
    1. 由于在堆叠中相继存储, 执行速度会更快。 堆积中的堆积会导致大量时间消耗, 从而使整个程序的执行速度放慢 。
    2. 如果将功能储存在堆积中(指针指向的沉降器),就不可能返回调用地址(堆叠是由于内存的顺序存储而提供的) 。

维基安瑟寄来的

堆堆叠

当函数或方法调用一个函数或方法调用另一个函数,而该函数轮流调用另一个函数等时,所有这些函数的履行将一直暂停,直到最后一个函数返回其值。

此挂起功能调用链是堆叠, 因为堆叠( 功能调用) 中的元素互相依赖 。

在例外情况处理和线索处决中,堆叠很重要。

堆肥

堆积仅仅是存储变量的程序所使用的内存。 堆积( 变数) 元素之间没有相互依存关系, 随时可以随机访问 。