堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
在以下 c 代码中
public void Method1()
{
int i = 4;
int y = 2;
class1 cls1 = new class1();
}
下面是内存的管理方式
调
本地变量只要在堆栈中进行函数调用, 只需持续时间。 堆积层的堆积层用于那些我们并不真正了解其一生的变量, 但是我们期望这些变量会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆叠中的话 。
对象(在更新时大小不同) 继续堆积, 因为我们不知道在创建时它们会持续多久。 在许多语言中, 堆积是垃圾, 以寻找不再有任何引用的对象( 如 cls1 对象) 。
在 java 中, 大多数对象会直接进入堆积。 以 c / c++、 structs 和 class 等语言, 当您不与指针打交道时, 通常会留在堆叠中 。
更多信息,请访问 :
堆叠和堆积内存分配的差别 Timmurphy.org
此处 :
在堆叠和堆放上创建对象
本条是上述图象的来源:六种重要的.net概念:堆叠、堆肥、价值类型、参考类型、拳击和开箱-代码项目
但要知道它可能含有一些不准确之处。
其他回答
其他人直接回答了您的问题, 但是当试图理解堆叠和堆积时, 我认为考虑传统的 unix 进程( 没有线条和基于 mmap () 的缩放符) 的内存布局( 没有线条和 mmap () 的缩放符 ) 。 内存管理词汇表网页有一张内存布局图 。
堆叠和堆肥传统上位于进程虚拟地址空间的对面。 堆叠在存取时自动增长, 以内核设定的大小( 内核可以使用设置限制( rlimit_ stack,...) 调整) 。 当内存分配器引用 brk () 或 sbrk () 系统调用时, 堆叠会增长, 将更多页的物理内存映入进程的虚拟地址空间 。
在没有虚拟内存的系统中,例如一些嵌入系统,通常适用同样的基本布局,但堆叠和堆积大小固定。然而,在其他嵌入系统中(例如基于微芯片的微控制器),程序堆叠是一个单独的内存块,无法通过数据移动指示处理,只能通过程序流指示(调用、返回等)进行间接修改或阅读。
什么是堆叠?
堆叠是一堆物体, 通常是排列整齐的物体。
调
计算架构中的堆栈是内存区域, 数据以最先出错的方式被添加或删除。 在多行应用程序中, 每串线索将有自己的堆栈 。
什么是堆积物?
堆积成堆的堆积物, 堆积成堆。
调
在计算结构中,堆积是一个动态分配的内存区域,由操作系统或内存管理库自动管理。 堆积上的内存在程序执行期间被分配、 分配和定期调整, 这可能导致一个叫做碎裂的问题。 当内存物体在小空格中被分配时, 碎片就会发生, 这些空格太小, 无法持有额外的内存对象。 净结果为堆积垃圾邮件的百分比 。
两者加在一起
在一个多行应用程序中, 每串线索都有自己的堆叠。 但是, 所有不同的线条都会共享堆积。 因为不同的线条在一个多行应用程序中共享堆积, 这还意味着线条之间必须有一些协调, 以便它们不会试图同时访问和操作堆积中的同一块内存 。
这是更快的--堆叠还是堆叠?为什么?
堆栈比堆叠要快得多。 这是因为堆叠上的内存分配方式。 堆叠上的内存分配和堆叠指针向上移动一样简单 。
对于新到编程的人来说,使用堆叠可能是一个好主意,因为堆叠比较容易。 因为堆叠是小的, 当你确切知道数据需要多少内存, 或者知道数据大小非常小时, 你会想使用它。 当你知道数据需要大量内存的时候, 使用堆叠比较好, 或者你不确定你需要多少内存( 如动态阵列 ) 。
Java记忆模型
调
堆栈是存储本地变量(包括方法参数)的内存区域。当涉及到对象变量时,这些变量只是堆积中实际对象的引用(指针)。每当一个对象被即时化,就会留出一块堆积内存以保持该对象的数据(状态)。由于对象可以包含其他对象,有些数据实际上可以保留这些嵌套对象的引用。
简言之,他们的意思是命令而不是命令!
堆叠:在堆叠项目中, 东西在彼此的顶端, 这意味着要更快和更有效 才能被处理!
所以总是有一个索引来指向特定项目, 处理速度也会更快, 这些项目之间也有关系!
堆肥:没有订单,处理速度会放慢, 价值会混乱在一起,没有具体的订单或索引... 是有随机的,它们之间没有关系... 所以执行和使用时间可以不同...
i 还创建下面的图像, 以显示它们可能看起来如何 :
调
其他人对大中风的反应也很好, 所以我要说几个细节。
堆叠和堆栈不需要是单数。 通常情况下, 您有一个以上的堆叠, 通常情况下, 您在一个过程中有多个线索。 在此情况下, 每个线索都有自己的堆叠。 您也可以有一个以上的堆叠, 例如, 一些 dll 配置可能导致不同堆堆分配不同的拖曳, 这就是为什么释放由不同库分配的内存通常是一个坏主意 。 c 您可以通过使用 Alloc 获得可变长度分配的好处 。
void myfunction()
{
char big[10000000];
// Do something that only uses for first 1K of big 99% of the time.
}
堆栈是内存的一部分,可以通过若干关键组装语言指令来操作,例如“pop”(从堆叠中移动并返回一个值)和“push”(将一个值推到堆叠中),但也可以调用(调用子例程 - 将地址推到堆叠中)和返回( 从子例程返回 - 将堆叠的地址从堆叠中跳出并跳到堆叠中)。这是堆叠指针登记册下方的内存区域,可以根据需要设置。堆叠也用于 pa 。
堆积是操作系统向一个应用程序提供的内存的一部分, 通常通过像马洛克这样的音响。 在现代套管上, 这个内存是一组只有呼叫程序才能进入的页面 。
堆叠的大小在运行时确定, 一般在程序启动后不会增长。 在 c 程序中, 堆叠需要足够大, 以保持每个函数中所有声明的变量。 堆叠会按需要动态增长, 但 巨头最终会发出呼唤( 它会增加的堆积量通常超过 merloc 要求的值, 这样至少有些未来的中枢不需要返回内核来获取更多的内核内存 。 此行为通常可以自定义 )
因为您在启动程序前已经分配了堆叠, 所以在您使用堆叠之前, 您从不需要在使用堆叠前使用滚动, 所以在实际操作中这是一个小的优势。 实际上, 很难预测什么是快速的,什么是缓慢的, 在拥有虚拟内存子系统的现代操作系统中, 因为这些页面是如何被安装的, 在哪里存储的, 是一个执行细节 。
推荐文章
- 在Objective-C中@property保留,赋值,复制,非原子
- Python内存泄漏
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 多少个参数是太多?
- 对于不可变集合上的非突变“add”方法,最好的名称是什么?
- Go中结构体的堆栈与堆分配,以及它们与垃圾收集的关系
- brk()系统调用做什么?
- foo到底是什么意思?
- foreach和map有区别吗?
- 为什么我应该使用Deque而不是Stack?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 什么是栈展开?
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?