堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?
当前回答
在以下 c 代码中
public void Method1()
{
int i = 4;
int y = 2;
class1 cls1 = new class1();
}
下面是内存的管理方式
调
本地变量只要在堆栈中进行函数调用, 只需持续时间。 堆积层的堆积层用于那些我们并不真正了解其一生的变量, 但是我们期望这些变量会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆叠中的话 。
对象(在更新时大小不同) 继续堆积, 因为我们不知道在创建时它们会持续多久。 在许多语言中, 堆积是垃圾, 以寻找不再有任何引用的对象( 如 cls1 对象) 。
在 java 中, 大多数对象会直接进入堆积。 以 c / c++、 structs 和 class 等语言, 当您不与指针打交道时, 通常会留在堆叠中 。
更多信息,请访问 :
堆叠和堆积内存分配的差别 Timmurphy.org
此处 :
在堆叠和堆放上创建对象
本条是上述图象的来源:六种重要的.net概念:堆叠、堆肥、价值类型、参考类型、拳击和开箱-代码项目
但要知道它可能含有一些不准确之处。
其他回答
最重要的一点是,堆积和堆叠是可分配记忆的方式的通用术语。 它们可以用许多不同的方式加以实施,这些术语适用于基本概念。
在一个堆叠的项目中,项目按放在另一堆的顺序坐在一个上方,您只能删除顶端的(不折叠整个事情)。 堆叠的简单性在于您不需要保存包含分配内存每一部分记录的表格; 您唯一需要的状态信息是到堆叠的尾端的单指针。 要分配和拆分, 您只需要递增和缩减单指针。 注意: 堆叠有时可以简单化 。
这些图像应该做一个相当不错的工作, 描述两种方式 分配和释放记忆 在堆叠和堆积。 yum!
如前所述,堆叠和堆叠是通用的术语,可以多种方式实施。计算机程序通常有一个称为呼叫堆叠的堆叠,存储与当前函数有关的信息,例如指向它从哪个函数中调出的任何函数,以及任何本地变量。因为函数调用其他函数,然后返回,堆叠和堆叠会增长和缩缩,以便从函数中往下保持信息。
其他人直接回答了您的问题, 但是当试图理解堆叠和堆积时, 我认为考虑传统的 unix 进程( 没有线条和基于 mmap () 的缩放符) 的内存布局( 没有线条和 mmap () 的缩放符 ) 。 内存管理词汇表网页有一张内存布局图 。
堆叠和堆肥传统上位于进程虚拟地址空间的对面。 堆叠在存取时自动增长, 以内核设定的大小( 内核可以使用设置限制( rlimit_ stack,...) 调整) 。 当内存分配器引用 brk () 或 sbrk () 系统调用时, 堆叠会增长, 将更多页的物理内存映入进程的虚拟地址空间 。
在没有虚拟内存的系统中,例如一些嵌入系统,通常适用同样的基本布局,但堆叠和堆积大小固定。然而,在其他嵌入系统中(例如基于微芯片的微控制器),程序堆叠是一个单独的内存块,无法通过数据移动指示处理,只能通过程序流指示(调用、返回等)进行间接修改或阅读。
许多答案作为概念是正确的,但我们必须指出,硬件(即微处理器)需要堆叠,才能调用子例程(用组装语言调用)。 (oop guys will call it ways)
在您保存返回地址的堆栈上, 并拨“ 推 / 重 ” Pop 由硬件直接管理 。
您可以使用堆叠来设定通过参数。 即使比使用登记册要慢( 微处理器大师会说, 或者好的 1980 年代生物书...) )
没有堆叠, 没有微处理器是行不通的。 (我们无法想象一个程序, 即使是在组装语言中, 没有子例程/功能) 没有它能工作的堆肥( 组装语言程序可以工作, 因为堆肥是一个 os 概念, 作为 malloc, 是一个 os/lib调用 ) 。
堆栈使用速度更快, 以 :
硬体是硬件,甚至推/棒也非常有效。 中转器需要输入内核模式,使用锁/石墨(或其他同步原始元素)执行某些代码,并管理一些跟踪分配情况所需的结构。
虚拟内存中的每个过程的堆叠、堆积和数据 :
调
堆叠 :
堆叠上创建的变量将超出范围,自动交易。 与堆叠上的变量相比, 分配速度要快得多。 使用实际的堆叠数据结构执行。 存储本地数据、 返回地址、 参数通过时使用的方法。 当堆叠过多使用时, 可能会出现堆叠溢出( 大多来自无限或过深的循环, 非常大的配置) 。 堆叠上创建的数据可以在没有指针的情况下使用 。
堆积 :
在 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;