堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
a couple of cents: 我认为, 绘制内存图形比较简单, 将会是件好事 :
调
箭头 - 显示生长堆叠和堆肥的位置, 进程堆叠大小有限制, 以 os 定义, 以线状线条参数为线状堆叠大小限制通常创建 api 。 通常以进程最大虚拟内存大小为限制, 例如32 位 2-4 gb 。
如此简单的方式:过程堆积对于过程和内部所有线条来说都是一般的, 用于记忆分配, 常见的情况是像 malloc () 。
堆栈是用于存储常见函数返回指针和变量的快速存储存储存储的快速内存, 被处理为函数调用中的参数, 本地函数变量 。
其他回答
科学家在最初决定两个建筑(Von Neumann,这里所有东西都被视为数据,Harvard,那里保留了用于指示的记忆区和另一个数据区)之间。 最终,我们采用了von Neumann设计,现在一切都被认为是“相同的”。 当我在学习组装时,这让我很难接受 https://www.cs.virginia.edu/~evans/cs216/guides/x8。
上面所有内容都在谈论数据。我的猜测是,既然教学是一个定义的事物, 带有特定的记忆足迹, 它会进入堆叠, 所以所有在集合中讨论的“ 那些” 登记册都在堆叠中。 当然, 然后以对象为方向的编程, 将指示和数据混合到一个动态的结构中, 所以现在指示也会被保存在堆肥上?
它们(在真实的计算机记忆中)在哪里和什么?
回答:两者都是在山上。
暂不考虑 :
公牛就像一张书桌, hdds/sds(永久存储)就像一张书架。 要阅读任何东西, 您必须在桌子上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您可以从书架上拉出来, 并在桌子上打开。 返回一本书, 您关闭桌子上的书架, 然后把它还给书架 。
堆叠和堆肥是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即用大号堆放)。
它们的范围是什么?它们各自的大小由什么决定?一个的大小由什么决定?一个的大小由什么决定?
答复:
堆栈是静态(固定大小) a. 编译器读取您代码中使用的变量类型。i. 它为这些变量分配了固定的内存量。 ii. 此内存的大小无法增长。 b. 内存是毗连的( 单块) , 因此存取有时比堆叠的更快。 放在堆叠上的一个物体在堆叠大小超过其大小的运行时会增加内存, 导致堆叠溢出错误, 堆积是动态( 变化大小) 数据 a. amoun 。
暂不考虑 :
堆叠和堆肥主要不是为了提高速度而引入的;它们被引入是为了处理内存溢出。 有关堆叠与堆积之间的第一个问题应该是:是否会出现内存溢出。 如果一个物体的大小打算增长到一个未知的数量(如链接的清单或其成员可以持有任意数量数据的对象),则将其放入堆肥。 尽可能使用 c++ 标准库(stl) 容器矢量、 地图和列表,因为它们是内存和列表。
在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后回去重新构思您的代码, 并检查它是否能够更高效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 i/ o / vs. cpu- imbound 任务, 也许添加多读或多处理 ) 。
因为程序的速度可能与堆叠或堆叠上分配的物品无关。
在多大程度上它们受国家或语言的运行时间控制?
答复:
堆叠大小由编译者在编译时确定。 堆积大小在运行时会变化。 (堆积在运行时与 os 一起工作,以分配内存 。)
暂不考虑 :
下面是控制和编译时间相对于运行时间操作的多一点。
每台计算机都有独特的指令集结构(isa),这是其硬件命令(例如“移动”、“跳”、“跳”、“添加”等)。
a os 只不过是一个资源管理者(控制如何/时间/和何处使用内存、处理器、装置和信息)。 os 的状态被称为光机,其余的命令被称为扩展机。 内核是扩展机的第一层。 它控制着诸如确定什么任务可以使用处理器(调度器)、多少内存或有多少硬件登记册可以分配给任务(调度器),以及任务的顺序。
cpu 堆和堆积与堆积与堆积与堆积与堆积与堆积之间,
所有现代的 cpus 都与“ 相同” 微处理理论合作: 它们都基于所谓的“ 注册者” 和一些“ 堆叠” 来取得性能。 所有 cpus 从一开始就有堆叠登记簿, 他们总是在这里, 说话的方式,如我所知。 组装语言从一开始就是相同的, 尽管从一开始, 直到... 微软和中间语言( i) 都改变了范式, 有了一种 oo 虚拟机组装语言。 这样我们就可以有一些 cli/ cil 。
cpus有堆叠登记册来加快存取记忆的速度,但与其他登记册相比,这些登记册是有限的,以充分利用所有可用于处理过程的存储器。 这就是为什么我们谈论堆叠和堆积分配的原因。
简而言之,一般而言,堆积是慢慢的,用于“全球”实例和对象内容,因为堆叠小而快,用于“本地”变量和参考(隐藏的指针要忘记管理这些变量和参考)。
所以当我们在一个方法中使用新关键字时, 引用( int) 是在堆叠中创建的, 但是对象及其全部内容( 价值类型以及对象) 都在堆积中创建, 如果我记得的话。 但是本地基本值类型和阵列是在堆叠中创建的 。
内存存存取的差别在于单元格的参考级别:处理堆积,即整个过程的记忆,在处理 cpu 登记册方面要求比处理当地“更多” 的堆叠更为复杂,因为如果我记得, cpu 堆积登记册被用作基地址。
这就是为什么当我们有非常长或无限的循环电话或循环时, 我们很快地被堆积物溢出, 而不冻结现代电脑上的系统...
cheap(ing) 与. net 中的堆叠(ing) 。
堆堆堆和堆堆:知道差别
储存的静态类内存分配c
堆叠和堆放在哪里?
https://en.wikipedia.org/wiki/Memory_management
https://en.wikipedia.org/wiki/Stack_register
功率语言资源:
组组编程辅导
64和ia-32建筑软件开发手册
堆叠基本上是一个容易获取的内存,它只是将项目管理成一个 - 井 - 堆叠。只有事先知道其大小的物品才能进入堆叠。数字、字符串、布林恩就是这种情况。堆叠是无法预设准确大小和结构的物品的内存。由于天体和阵列可以在运行时变形和改变,它们必须进入堆叠。
源源代码:academinide
我有一些要分享的,虽然主要要点已经涵盖在内。
堆叠堆叠
快速访问。 存储在 rap 中。 函数调用会与本地变量和函数参数一起装入这里。 当程序退出范围时, 空间会自动释放。 存储在连续内存中 。
堆肥
相对于堆叠的存取速度较慢。 储存在堆叠中。 动态生成的变量存储在这里, 以后需要使用后释放分配的内存 。 保存在存储分配处, 指示器总是访问 。
有意思的注意:
如果功能电话被储存在堆叠中,就会造成两个混乱点:由于堆叠中顺序存储,执行速度更快。 堆积中储存会导致大量时间消耗,从而使整个程序的执行速度放慢。 如果功能被储存在堆积中(指针指向的混凝土存储器),就不可能返回调用地址(由于堆叠中顺序存储内存而导致堆叠) 。