当前位置:首页 > 内存 > 正文

内存中的堆和栈的不同

  • 内存
  • 2024-05-29 06:56:25
  • 7912

一、堆和栈的区别

1.管理方式不同

堆是由程序员通过调用系统库函数来管理的。因此,如果管理不有效,就会出现众所周知的内存泄漏。

堆栈是计算机系统分配的内存,系统有一个专门的寄存器来存储堆栈指针。

2.不同的增长方式

堆向更高的地址扩展,也就是常说的向上增长。它是一个不连续的内存区域。

堆栈向较低地址扩展,即常说的向下增长。是一个连续的内存区域。


3.不同的空间大小

堆大小可以达到4G,这是有效的。在32位Linux系统中,虚拟内存也有3.2GB

堆栈大小通常在1M到10M之间(与堆有很大不同)。

4.内存速度不同

堆栈内存速度更快。前面说过,栈是系统分配的内存,并且有这个FILO上下文序列,所以栈内存速度比较快。

堆由程序员分配,由C/C++函数库提供。另外,机制也比较复杂,你得一一翻遍才能找到合适大小的内存区域。所以需要更多的时间。

5.存储内容不同

调用函数时,堆栈首先将下一条指令的地址压入调用函数(函数调用指令的下一条可执行指令),然后是函数参数,然后是本地变量被调用函数的变量。

调用完成后,首先将局部变量从堆栈中弹出,然后是参数,最后堆栈顶部指针指向第一条存储指令的地址。程序继续执行下一条可执行指令。

堆通常使用一个字节在标头中存储其大小。堆用于存储其生命周期与函数调用无关的数据。具体内容由程序员整理。


二、堆和栈的区别是啥?

堆和栈的区别:
1.堆栈空间分配的差异:

1.栈(操作系统):由操作系统自动分配和释放,存储函数参数值和局部变量值等,其操作方法与数据结构中的栈类似;

2.堆(操作系统):一般由程序员分配和释放。如果程序员不释放它,当程序结束时它可能会被操作系统回收。分配方法类似于链表。

2.堆栈缓存方式的区别:

1.堆栈使用一级缓存。它们通常在调用时就在存储空间中,调用完成后立即释放;

2.堆存储在二级缓存中,生命周期由虚拟机的垃圾回收算法决定(并不是一旦成为孤儿对象就可以回收)。因此,调用这些对象的速度是比较低的。

3.栈数据结构的区别:

堆(数据结构):堆可以看做是一棵树,如:堆排序;

栈(数据结构):一棵树输入、后出数据结构。

扩展信息:

堆支持以下基础知识:

:创建空堆;

:向堆中插入一个新元素;

:提升新元素,使其符合堆的属性;

:获取当前堆顶元素的值;

:删除堆顶元素;

y:使堆顶元素被删除的堆重新成为堆。

一些堆实现还支持其他操作。例如,斐波那契堆支持检查堆中是否存在元素。

栈的基本算法

算法

①如果TOP≥n,则给出溢出信息并进行错误处理(入栈前,先检查栈是否满,如果满则溢出;如果不,做②);

②设置TOP=TOP+1(堆栈指针加1,指向入栈地址);

③S(TOP)=X,end(X为新入栈的元素);

2.出栈(POP)算法

①若TOP≤0,则给出下溢信息并进行错误处理(出栈前检查栈是否为空,如果为空,如果不为空,则执行②);

②X=S(TOP),(出栈后的元素赋给top)。

参考资料::Stack

:Stack