堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
堆叠基本上是一个容易获取的内存,它只是将项目管理成一个 - 井 - 堆叠。只有事先知道其大小的物品才能进入堆叠。数字、字符串、布林恩就是这种情况。堆叠是无法预设准确大小和结构的物品的内存。由于天体和阵列可以在运行时变形和改变,它们必须进入堆叠。
源源代码:academinide
其他回答
堆栈是作为执行线条的抓抓空间预留的内存。当函数被调用时,在堆栈顶部为本地变量和一些簿记数据预留一个区块。当该函数返回时,块就会被未使用,下次调用函数时就可以使用。堆栈总是保留在利弗(最先出)顺序中;最近保留的区块总是下一个要解开的区块。这样就可以很容易地跟踪堆叠; fr 。
堆积是用于动态分配的内存。 与堆叠不同, 堆积区块的分配和分配没有强制模式; 您可以随时分配块块, 并随时释放它。 这使得跟踪堆积中哪些部分在任何特定时间分配或免费更为复杂; 许多定制的堆积分配器可用于调和不同使用模式的堆积性能 。
每一串线索都有堆叠, 而通常应用程序只有一堆(尽管对于不同种类的分配来说, 多堆堆并不罕见) 。
直接回答你的问题:
在多大程度上它们受国家或语言运行时间控制?
当线索创建时, os 分配每个系统级线索的堆叠。 通常, os 被语言运行时间调用来分配应用程序的堆叠 。
其范围是什么?
堆栈附在线条上,因此当线条退出时,堆栈被回收。堆积通常在运行时在应用程序启动时分配,在应用程序(技术处理)退出时再回收。
是什么决定了每个孩子的大小?
当创建线索时,会设定堆栈的大小。 程序启动时会设定堆积的大小, 但随着空间需要, 可能会增长( 分配器需要操作系统的更多内存 ) 。
是什么让一个更快?
堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存( 指针/ 内插器只是递增或衰减) 变得微不足道, 而堆叠在分配或交易位置上有复杂得多的簿记。 另外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 从而非常快。 堆积的另一个性能冲击是堆积, 主要是全球资源, 通常是 h 。
清晰的演示:图像来源: vikashazrati.wordpress.com
因为有些答案没有被选中, 我要贡献我的米特。
令人惊讶的是,没有人提到,不仅在外来语言(文稿)或平台(英特环)中,而且在纤维、绿线和一些共程实施中,都能找到多个(即与运行的骨层线数无关的)呼叫堆叠。
纤维、绿线和绿线在很多方面都相似,这导致许多混乱。 纤维和绿线之间的区别在于前者使用合作性多任务,而后者可能以合作性或先发制人(甚至两者兼而有之)为特点。
无论如何,两种纤维、绿线和共程的目的都是同时执行多种功能,但并非在单一星级线内平行执行(为区分而见此问题),以有组织的方式相互之间相互转移控制权。
当使用纤维、绿线或共程时,您通常每个函数都有单独的堆叠。 (在技术上,不只是堆叠,而是整个执行环境是每个函数。 最重要的是, cpu 登记册。 ) 对于每一个线串, 每一个线串都有与同时运行的函数一样多的堆叠, 而线串正在根据程序逻辑执行每个函数。 当函数运行到尾端时, 它的堆叠就会被销毁。 因此, 堆叠的数量和寿命都是个王宫 。
注意我所说的“ 通常每个函数有一个单独的堆叠 ” 。 有堆叠和堆叠的 courutines 。 最显著的堆叠 c++ 执行是 推进. coroutine 和 微软 ppl 的 async/ wait 。 (然而, c++ 的可恢复功能 (a. k. a. a. “ 合成和等待 ” ) , 这些功能被建议到 c++/17 , 可能会使用没有堆叠的 comutines 。 )
C++标准图书馆的纤维建议即将提出。 还有一些第三方图书馆。 绿线在Python 和 Ruby 等语言中非常受欢迎。
堆叠基本上是一个容易获取的内存,它只是将项目管理成一个 - 井 - 堆叠。只有事先知道其大小的物品才能进入堆叠。数字、字符串、布林恩就是这种情况。堆叠是无法预设准确大小和结构的物品的内存。由于天体和阵列可以在运行时变形和改变,它们必须进入堆叠。
源源代码:academinide
我想其他很多人 已经给了你 大部分正确的答案 关于这件事情。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店”。 之所以有这种区别,是因为最初的免费商店是用被称为“二成式堆肥”的数据结构来安装的。 因此,从早期实施中分配的麦洛克()/免费()是从堆肥中分配的。 然而,在现代,大多数免费商店都是用非常精密的数据结构来安装的,而不是二成式堆肥。
堆叠 :
堆叠上创建的变量将超出范围,自动交易。 与堆叠上的变量相比, 分配速度要快得多。 使用实际的堆叠数据结构执行。 存储本地数据、 返回地址、 参数通过时使用的方法。 当堆叠过多使用时, 可能会出现堆叠溢出( 大多来自无限或过深的循环, 非常大的配置) 。 堆叠上创建的数据可以在没有指针的情况下使用 。
堆积 :
在 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;
推荐文章
- 如何找到Java堆大小和内存使用(Linux)?
- 为什么不使用异常作为常规的控制流呢?
- 什么是序列化?
- 每个递归都可以转换成迭代吗?
- 在Objective-C中@property保留,赋值,复制,非原子
- Python内存泄漏
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 多少个参数是太多?
- 对于不可变集合上的非突变“add”方法,最好的名称是什么?
- Go中结构体的堆栈与堆分配,以及它们与垃圾收集的关系
- brk()系统调用做什么?
- foo到底是什么意思?
- foreach和map有区别吗?
- 为什么我应该使用Deque而不是Stack?