堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
因为有些答案没有被选中, 我要贡献我的米特。
令人惊讶的是,没有人提到,不仅在外来语言(文稿)或平台(英特环)中,而且在纤维、绿线和一些共程实施中,都能找到多个(即与运行的骨层线数无关的)呼叫堆叠。
纤维、绿线和绿线在很多方面都相似,这导致许多混乱。 纤维和绿线之间的区别在于前者使用合作性多任务,而后者可能以合作性或先发制人(甚至两者兼而有之)为特点。
无论如何,两种纤维、绿线和共程的目的都是同时执行多种功能,但并非在单一星级线内平行执行(为区分而见此问题),以有组织的方式相互之间相互转移控制权。
当使用纤维、绿线或共程时,您通常每个函数都有单独的堆叠。 (在技术上,不只是堆叠,而是整个执行环境是每个函数。 最重要的是, cpu 登记册。 ) 对于每一个线串, 每一个线串都有与同时运行的函数一样多的堆叠, 而线串正在根据程序逻辑执行每个函数。 当函数运行到尾端时, 它的堆叠就会被销毁。 因此, 堆叠的数量和寿命都是个王宫 。
注意我所说的“ 通常每个函数有一个单独的堆叠 ” 。 有堆叠和堆叠的 courutines 。 最显著的堆叠 c++ 执行是 推进. coroutine 和 微软 ppl 的 async/ wait 。 (然而, c++ 的可恢复功能 (a. k. a. a. “ 合成和等待 ” ) , 这些功能被建议到 c++/17 , 可能会使用没有堆叠的 comutines 。 )
C++标准图书馆的纤维建议即将提出。 还有一些第三方图书馆。 绿线在Python 和 Ruby 等语言中非常受欢迎。
其他回答
我有一些要分享的,虽然主要要点已经涵盖在内。
堆叠堆叠
快速访问。 存储在 rap 中。 函数调用会与本地变量和函数参数一起装入这里。 当程序退出范围时, 空间会自动释放。 存储在连续内存中 。
堆肥
相对于堆叠的存取速度较慢。 储存在堆叠中。 动态生成的变量存储在这里, 以后需要使用后释放分配的内存 。 保存在存储分配处, 指示器总是访问 。
有意思的注意:
如果功能电话被储存在堆叠中,就会造成两个混乱点:由于堆叠中顺序存储,执行速度更快。 堆积中储存会导致大量时间消耗,从而使整个程序的执行速度放慢。 如果功能被储存在堆积中(指针指向的混凝土存储器),就不可能返回调用地址(由于堆叠中顺序存储内存而导致堆叠) 。
来自Wikianwser。
堆叠堆叠
当函数或方法调用一个函数或方法调用另一个函数,而该函数轮流调用另一个函数等时,所有这些函数的履行将一直暂停,直到最后一个函数返回其值。
此挂起函数调用链链是堆叠, 因为堆叠( 功能调用) 中的元素互相依赖 。
在处理例外情况和处决线索时,堆叠很重要。
堆肥
堆积仅仅是存储变量的程序所使用的内存。 堆积( 变数) 元素不互相依赖, 随时可以随机访问 。
其他人对大中风的反应也很好, 所以我要说几个细节。
堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。
void myfunction()
{
char big[10000000];
// Do something that only uses for first 1K of big 99% of the time.
}
堆叠 :
堆叠上创建的变量将超出范围,自动交易。 与堆叠上的变量相比, 分配速度要快得多。 使用实际的堆叠数据结构执行。 存储本地数据、 返回地址、 参数通过时使用的方法。 当堆叠过多使用时, 可能会出现堆叠溢出( 大多来自无限或过深的循环, 非常大的配置) 。 堆叠上创建的数据可以在没有指针的情况下使用 。
堆积 :
在 c+++ 中, 堆积上的变量必须手动销毁, 并且绝不会掉出范围 。 数据通过删除、 删除或自由解脱而解脱。 与堆叠上的变量相比, 分配速度较慢。 需要时使用来分配块块数据供程序使用。 当有大量分配和交易位置时, 可能会发生碎裂 。 在 c+++ 或 c 中, 堆积上生成的数据将被指向指针, 并分别与新数据或中位相分配 。
例如:
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;
您可以用堆叠做一些有趣的事情。例如,您有像 Alloca(假设您能够通过关于堆叠使用的大量警告)这样的功能,这是一种形式的中转器,专门用堆叠而不是堆叠来记忆。
也就是说,基于堆叠的内存错误是我经历过的最糟糕的内存错误。 如果您使用堆积内存, 并且越过分配区块的界限, 您有触发断段故障的好机会 。 ( 不是100%: 您的区块可能附带地与先前分配的区块相毗连 。) 但是由于堆叠上创建的变量总是相互连结, 写出边框可以改变另一个变量的值 。 我了解到, 只要我感觉到, 只要我感觉到它, 就会改变另一个变量的值 。