堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
我想其他很多人 已经给了你 大部分正确的答案 关于这件事情。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店”。 之所以有这种区别,是因为最初的免费商店是用被称为“二成式堆肥”的数据结构来安装的。 因此,从早期实施中分配的麦洛克()/免费()是从堆肥中分配的。 然而,在现代,大多数免费商店都是用非常精密的数据结构来安装的,而不是二成式堆肥。
其他回答
您可以用堆叠做一些有趣的事情。例如,您有像 Alloca(假设您能够通过关于堆叠使用的大量警告)这样的功能,这是一种形式的中转器,专门用堆叠而不是堆叠来记忆。
也就是说,基于堆叠的内存错误是我经历过的最糟糕的内存错误。 如果您使用堆积内存, 并且越过分配区块的界限, 您有触发断段故障的好机会 。 ( 不是100%: 您的区块可能附带地与先前分配的区块相毗连 。) 但是由于堆叠上创建的变量总是相互连结, 写出边框可以改变另一个变量的值 。 我了解到, 只要我感觉到, 只要我感觉到它, 就会改变另一个变量的值 。
当在加载代码和数据设置后创建进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 启动一个进程, 然后在装入代码和数据设置后启动堆放
当需要更多堆积时, os 将会动态分配, 而堆积块总是几乎毗连
请见 brk ()、 sbrk () 和 ALloca () 系统在 Linux 中调用
我有一些要分享的,虽然主要要点已经涵盖在内。
堆叠堆叠
快速访问。 存储在 rap 中。 函数调用会与本地变量和函数参数一起装入这里。 当程序退出范围时, 空间会自动释放。 存储在连续内存中 。
堆肥
相对于堆叠的存取速度较慢。 储存在堆叠中。 动态生成的变量存储在这里, 以后需要使用后释放分配的内存 。 保存在存储分配处, 指示器总是访问 。
有意思的注意:
如果功能电话被储存在堆叠中,就会造成两个混乱点:由于堆叠中顺序存储,执行速度更快。 堆积中储存会导致大量时间消耗,从而使整个程序的执行速度放慢。 如果功能被储存在堆积中(指针指向的混凝土存储器),就不可能返回调用地址(由于堆叠中顺序存储内存而导致堆叠) 。
其他人对大中风的反应也很好, 所以我要说几个细节。
堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。
void myfunction()
{
char big[10000000];
// Do something that only uses for first 1K of big 99% of the time.
}
虚拟内存中的每个过程的堆叠、堆积和数据 :
调