- 什么是堆叠和堆叠?
- 他们在电脑记忆中身处何方?
- 它们在多大程度上受到操作系统或语言运行时间的控制?
- 其范围是什么?
- 是什么决定了它们的大小?
- 是什么让一个更快?
当前回答
堆堆叠
- 非常快速接入
- 不必明确排除可变变量
- 由CPU有效管理空间,内存不会分散
- 仅本地变量
- 对堆叠大小的限制(取决于OS)
- 变量无法调整大小
堆肥
- 可在全球范围内访问变量
- 内存大小无限制
- (相对)获取较慢
- 没有保证有效使用空间的保证,随着时间推移,记忆可能会变得支离破碎,因为分配了记忆区块,然后释放了
- 您必须管理内存( 您负责分配和释放变量) 。
- 可使用 elloc () 调整变量大小
其他回答
堆叠当您调用函数时,该函数的参数加上一些其他间接费用被放在堆栈中。有些信息(例如返回后将到何处)也存储在那里。当您在函数中声明变量时,该变量也分布在堆栈中。
拆分堆栈很简单, 因为您总是按照您分配的反向顺序进行排列。 在输入函数时添加堆叠材料, 当退出时相应数据将被删除。 这意味着您倾向于留在堆叠的小区域内, 除非您调用许多函数来调用其他函数( 或创建循环解决方案 ) 。
堆肥堆积是一个通用的名称, 用于您将创建的数据放在哪里 。 如果您不知道您的程序要创建多少宇宙飞船, 您可能会使用新的( 或商略或等效的) 操作员来创建每艘宇宙飞船 。 此分配将会停留一段时间, 因此我们很可能释放的东西, 与我们创建的顺序不同 。
因此,堆积要复杂得多,因为最终会出现一些未使用的内存区域,这些区域与块状的内存间断 — — 内存会变得支离破碎。 找到您需要的大小的自由内存是一个困难的问题。 这就是为什么应该避免堆积(尽管它仍然经常被使用 ) 。
执行 执行 执行堆叠和堆叠的操作通常要到运行时间/操作系统。 通常游戏和其他功能至关重要的应用程序会创造自己的内存解决方案,从堆叠中抓取大量内存,然后在内部将内存分离出来,以避免依赖操作系统进行内存。
只有当你的记忆用法与常规有很大不同时, 也就是在游戏中, 在一个巨大的操作中加载一个水平, 并且可以在另一个巨大的操作中将整个批量扔掉时, 这才是实际的。
内存物理位置这比你想的要少 因为一种技术叫做虚拟内存这使得您的程序认为您可以访问某位地址, 物理数据在其他地方( 甚至是硬盘上! ) 。 您获得的堆叠地址随着您的呼叫树越深, 顺序越大。 堆放的地址是不可预知的( 具体化) , 坦率地说并不重要 。
当在加载代码和数据操作系统设置后创建一个进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 程序在装入代码和数据操作系统设置后启动堆放
当需要更多堆积时, OSS 将动态分配, 堆积块总是几乎毗连
请参看请见brk()
, sbrk()
和alloca()
系统在 Linux 中调用
许多答案作为概念是正确的,但我们必须指出,硬件(即微处理器)需要堆叠,才能调用子程序(集合语言的CALL)。 (OOP的家伙会称之为它)。方法)
在堆叠上,您保存返回地址, 并呼叫 push / ret pop 由硬件直接管理 。
您可以使用堆栈来设定通过参数. 即使比使用登记册要慢( 微处理器大师会说, 还是一本好的 1980s BIOS 书...) 。
- 没有堆叠无 无微处理器可以工作。 (我们无法想象一个程序, 即使是以组装语言, 没有子例程/功能)
- (一个集会语言方案可以工作,因为这个语言方案是一个OS概念,作为cloc,即OS/Lib呼叫。)
堆叠使用速度更快, 如下:
- 硬件,甚至推/棒子都是非常有效的。
- 商场需要进入内核模式,使用锁/气压(或其他同步原始物),执行一些代码,并管理一些跟踪分配情况所需的结构。
它们在哪里? 它们在哪里? (在真实的电脑记忆中)
回答: 两者都在记录和档案调控系统。
分会 :
内存就像一个书桌, HDDs/ SSDs( 永久存储) 像书架一样。 要阅读任何东西, 您必须在桌上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您必须把它从书架上拉出来, 然后在桌子上打开。 要退回一本书, 您必须关闭桌上的书架, 然后把它归还到书架上 。
堆积和堆积是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即记录和档案管理)。
其范围是什么?
是什么决定了每个孩子的大小?
是什么让一个更快?
回答:
堆叠为静态(固定大小)数据
a 。编译者在编译时读取代码中使用的变量类型。
(一) 为这些变量分配固定数量的内存。
二. 此记忆的大小无法增长 。b. b. 数据内存是毗连的( 单个区块) , 所以访问是 有时有时 比堆积速度快
c. 用于以下目的:放置在堆叠堆叠上的一个物体,该物体在超过堆叠大小的运行时会生成内存,导致 堆堆堆堆堆溢溢溢出错误
堆肥用于动态(变化大小)数据
a 。内存量仅受内存存储器可用空空空间数量的限制
(一) 使用的数量在运行时可按需要增长或缩减。b. b. 数据由于项目在堆积上分配,只要在内存记录和档案记录室中存在空空空间,数据并不总是在毗连部分中,而 有时有时 访问比堆叠慢
c. 用于以下目的:程序手动将项目与
new
keyword 和 Must 手动移动此内存, 当它们使用它完成后 。
一. 重复分配新内存的代码,在不再需要新内存时,不将新内存分配到内存泄漏。
分会 :
堆叠和堆积堆肥主要不是为了提高速度而引入;它们被引入是为了处理内存溢出。关于堆叠与堆积之间的第一个关注点应该是是否会出现内存溢出。如果一个对象打算将大小扩大为未知数量(如链接列表或其成员可以持有任意数量数据的对象),则将其放置在堆积上。尽可能使用 C++ 标准库(STL) 容器。矢量, 地图图图图地图, 和列表列表因为它们是记忆和速度效率高的,并增加使你的生活更加轻松(你不必担心记忆分配/迁移)。
在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后返回并重新构思您的代码, 并查看它是否能够更有效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 I/ O 对 CPU 的任务, 也许添加多读或多处理 ) 。
我说有时有时速度较慢/ 较快, 因为程序的速度可能与堆叠或堆叠上分配的项目无关 。
它们在多大程度上受到操作系统或语言运行时间的控制?
回答:
堆叠大小由汇编者在汇编时确定。
在运行期间,堆积大小各有不同。 (堆积在运行时与操作系统一起工作,以分配内存。)
分会 :
以下是更多关于控制和编译时间与运行时间操作的更多信息。
每台电脑都有独特的指令设置结构(ISA),即其硬件指令(例如“MOVE”、“JUMP”、“ADD”等)。
操作系统只不过是一个资源管理者(控制如何/何时/和何处使用内存、处理器、装置和信息)。
安全操作系统的ISA被称为光机其余命令被命名为扩展机。内核是扩展机器的第一层。 它控制着类似
- 确定要使用处理器(调度器)的任务,
- 分配给任务(调度员)的内存多少或硬件登记册多少,以及
- 执行任务的顺序(交通控制器)。
当我们说“编译者”时,我们通常是指编译者、组装者和链接者在一起
- 编译者将源代码转换为组装语言,并将其传给装配者,
- 装配器将装配语言转换成机码(ISA命令),并传给链接器
- 链接器将所有机器代码( 可能来自多个源文件) 合并成一个程序 。
机器代码在被执行时传递到内核, 由内核决定它何时应该运行并控制, 但机器代码本身包含ISA命令, 用于请求文件, 请求内存等。 所以代码发布 ISA 命令, 但一切都要通过内核 。