首页 > 编程知识 正文

操作系统中的堆栈都是干什么的,计算机什么操作用堆栈

时间:2023-05-03 07:19:48 阅读:239767 作者:2215

堆和栈是两种内存分配的统称。

一.栈

栈会存放函数的局部变量,函数的返回地址等。栈有"LIFO"(后进先出)的特点。栈由操作系统分配,自动回收.栈的大小受到限制。在x86体系下,栈一般通过esp 指向栈帧顶部,ebp指向底部不断的嵌套或者为局部变量分配空间,可能导致栈溢出。这时候会触发一个异常在执行完一个函数的时候,其中的变量都会从堆栈中弹出。无需亲自管理内存,变量会自动分配和释放。栈一般是高地址向低地址扩展,函数返回的时候,会通过返回原来的位置来释放空间。栈对应的是CPU的一级缓存,一级缓存在CPU内部,访问快,比较小

二.堆

堆是计算机中不会自动管理的区域,不受CPU严格管理,它是内存中更加自由浮动的区域。我们可以通过封装好的函数(malloc/calloc/new…)来进行内存分配内核维护了一个brk指针,指向堆的顶部,将堆视为大小不同的块的集合来进行维护,每一个块就是一个连续的虚拟内存,要么是已经分配的,要么是空闲的,已经分配的块显式的保留为供应用程序使用,空闲块可以分配内存。堆是从低地址向高地址扩展,是不连续的内存区域。系统通过链表来存储空闲内存地址。一般在堆的头部用一个字节存放堆的大小。堆一般是CPU二级缓存,CPU和内存之间的地址,访问比一级缓存慢,但是比读内存快,容量比较大在多线程的情况下,线程有自己的栈,彼此共享创建他们的进程的堆。堆分配的内存必须进行手动释放

三.区别

管理方式:

对于栈来讲,是由编译器自动管理。对于堆来说,分配释放工作由程序员控制,容易造成内存泄露。

空间大小:

一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的。

碎片问题:

对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,操作系统会自动回收.

生长方向:

对于堆来讲,向着内存地址增加的方向增长(低地址向高地址);对于栈来讲,向着内存地址减小的方向增长(高地址向低地址)。

分配方式:

堆都是动态分配(运行期)的,没有静态分配(编译期)的堆。栈有2种分配方式:静态分配和动态分配(alloca()函数可以动态分配栈的内存空间,释放的时候由编译器自己释放)。

分配效率:

计算机在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,效率比栈要低得多。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。