- 什么是堆叠和堆叠?
- 他们在电脑记忆中身处何方?
- 它们在多大程度上受到操作系统或语言运行时间的控制?
- 其范围是什么?
- 是什么决定了它们的大小?
- 是什么让一个更快?
当前回答
堆堆叠
- 非常快速接入
- 不必明确排除可变变量
- 由CPU有效管理空间,内存不会分散
- 仅本地变量
- 对堆叠大小的限制(取决于OS)
- 变量无法调整大小
堆肥
- 可在全球范围内访问变量
- 内存大小无限制
- (相对)获取较慢
- 没有保证有效使用空间的保证,随着时间推移,记忆可能会变得支离破碎,因为分配了记忆区块,然后释放了
- 您必须管理内存( 您负责分配和释放变量) 。
- 可使用 elloc () 调整变量大小
其他回答
哇,这么多答案,我觉得其中的某个人搞错了...
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
我想许多其他人 已经给了你 大多是正确的答案 这个问题。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。
简单的说, 堆栈是创建本地变量的地方。 另外, 每次你调用一个子常规, 程序计数器( 指针到下一个机器指令) 和任何重要的登记器, 有时参数会被推到堆叠上。 然后, 子常规内的任何本地变量都会被推到堆叠上( 并在那里使用 ) 。 当子常规完成后, 所有的东西都会从堆叠上跳出来。 PC 和注册数据都会得到并放回原位, 这样您的程序就可以继续其快乐的方式 。
堆积是用( 明确的“ 新 ” 或“ 分配 ” 调用 ” 调用 ) 来分配记忆的动态空间。 它是一个特殊的数据结构, 可以跟踪大小不一的记忆区块及其分配状况 。
在“古典”系统中,内存记录仪被设置得非常清晰,使堆叠指针从记忆的底部开始,堆积指针从顶部开始,它们相互向上发展。如果它们重叠,你就退出内存。虽然这与现代多轨操作系统不起作用。每条线必须有自己的堆叠,并且它们可以动态地生成。
几分钱:我想,画出内存图形和简单一些是件好事:
箭头 - 显示生长堆叠和堆叠、流程堆叠大小的极限, 以 OS 定义, 通常由线条中的线状堆叠大小的参数来设定 API 。 厚通常通过进程限制最大虚拟内存大小, 例如32 位 2 - 4 GB 。
简单的方法就是简单的方法:过程堆叠对于过程和内部所有线条都是一般的, 用于记忆分配, 通常使用类似的方式中偏().
Stack 是常见情况下存储的快速内存, 用于存储函数返回指针和变量, 处理为函数调用参数, 本地函数变量 。
当在加载代码和数据操作系统设置后创建一个进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 程序在装入代码和数据操作系统设置后启动堆放
当需要更多堆积时, OSS 将动态分配, 堆积块总是几乎毗连
请参看请见brk()
, sbrk()
和alloca()
系统在 Linux 中调用