- 什么是堆叠和堆叠?
- 他们在电脑记忆中身处何方?
- 它们在多大程度上受到操作系统或语言运行时间的控制?
- 其范围是什么?
- 是什么决定了它们的大小?
- 是什么让一个更快?
当前回答
其他人直接回答了你的问题,但是,在试图理解堆叠和堆叠时,我认为,考虑传统的UNIX进程的记忆布局(没有线条和线条)是有益的。mmap()
- 以基于分配器为基础。记忆管理词汇表网页上有一个内存布局图。
堆堆和堆堆堆传统上位于进程的虚拟地址空间的对面。当访问时,堆堆会自动增长,最多以内核设定的大小(可以与setrlimit(RLIMIT_STACK, ...)
))当内存分配器援引brk()
或sbrk()
系统呼叫,绘制更多页的物理内存 进入该过程的虚拟地址空间。
在没有虚拟内存的系统中,例如一些嵌入系统,通常适用同样的基本布局,但堆叠和堆积大小固定。然而,在其他嵌入系统(例如基于微芯片的微控制器)中,程序堆叠是一个单独的内存块,无法通过数据移动指示处理,只能通过程序流指示(调用、返回等)进行间接修改或阅读。多个堆叠。从这个意义上说,堆叠是CPU结构的一个元素。
其他回答
在下面的 C# 代码中
public void Method1()
{
int i = 4;
int y = 2;
class1 cls1 = new class1();
}
下面是内存管理的方法
Local Variables
只需在堆叠中进行函数调用, 就会持续多久。 堆放堆放的堆放量用于那些我们一生中并不真正了解的变量, 但是我们期望它们会持续一段时间。 在大多数语言中, 关键是我们在编译时知道一个变量有多大, 如果我们想将其存储在堆放堆放中, 就必须知道它有多大 。
对象( 大小随更新而不同 ) 跳到堆积上, 因为我们不知道在创建时它们会持续多久 。 在许多语言中, 堆积是垃圾, 以寻找不再有任何引用的对象( 如 cls1 对象 ) 。
在 Java 中, 大多数对象都直接进入堆肥中。 在 C / C++ 等语言中, 支架和类通常可以在不与指针打交道时留在堆叠中 。
更多信息,请访问以下网站:
Timmurphy. org 表示堆叠和堆积记忆分配的差别。
此处 :
本条是上述情况的来源:6个重要的.NET概念:堆叠、堆积、价值类型、参考类型、拳击和拆箱-代码项目
但要知道它可能含有一些不准确之处。
我想许多其他人 已经给了你 大多是正确的答案 这个问题。
然而,一个被忽略的细节是,“堆积”实际上可能应该被称为“免费商店 ” 。 之所以有这种区别,是因为最初的免费商店是用一个称为“binomial heap”的数据结构实施的。 因此,从早期实施中分配的麦洛克()/免费()是从堆积中分配的。 然而,在现代,大部分免费商店都是用非常精密的数据结构实施的,而不是二元式的堆积。
许多答案作为概念是正确的,但我们必须指出,硬件(即微处理器)需要堆叠,才能调用子程序(集合语言的CALL)。 (OOP的家伙会称之为它)。方法)
在堆叠上,您保存返回地址, 并呼叫 push / ret pop 由硬件直接管理 。
您可以使用堆栈来设定通过参数. 即使比使用登记册要慢( 微处理器大师会说, 还是一本好的 1980s BIOS 书...) 。
- 没有堆叠无 无微处理器可以工作。 (我们无法想象一个程序, 即使是以组装语言, 没有子例程/功能)
- (一个集会语言方案可以工作,因为这个语言方案是一个OS概念,作为cloc,即OS/Lib呼叫。)
堆叠使用速度更快, 如下:
- 硬件,甚至推/棒子都是非常有效的。
- 商场需要进入内核模式,使用锁/气压(或其他同步原始物),执行一些代码,并管理一些跟踪分配情况所需的结构。
堆叠 :
- 存储在计算机内存中 就像堆积物一样
- 堆叠上创建的变量将超出范围, 自动进行交易 。
- 与堆积上的变量相比,分配速度要快得多。
- 采用实际的堆叠数据结构。
- 存储本地数据, 返回地址, 用于通过参数 。
- 当堆叠使用过多时(大部分来自无限重现或过深重重循环,分配量很大), 堆叠就会溢出。
- 在堆栈上创建的数据可以不用指针使用 。
- 如果您确切知道在编译时间之前需要分配多少数据, 并且数据并不太大, 您就会使用堆叠 。
- 通常在程序启动时已经确定了最大尺寸 。
热量 :
- 存储在计算机内存 和堆叠一样。
- 在 C+++ 中, 堆积上的变量必须手动销毁, 并且绝对不能脱离范围。 数据以
delete
,delete[]
,或free
. - 相对于堆叠上的变量, 较慢分配速度 。
- 用于按需分配一组数据供程序使用。
- 当有大量拨款和交易时,就有可能支离破碎。
- 在C++ 或C++ 或C中,在堆积上生成的数据将用指针指出,并用
new
或malloc
两者分别。 - 如果要求分配的缓冲量太大,则可以造成分配失败。
- 如果您不知道运行时需要多少数据, 或者需要分配大量数据, 您就会使用这种数据 。
- 负责内存泄漏
示例:
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;