C语言堆和栈的区别是什么?

一、问题

        栈是存放函数的所有动态局部变量及函数调⽤和返回有关信息的⼀块内存。它为调试程序提供了⼀种功能,能够显示⼀个已被调⽤的函数的列表,这是调试程序时⼀种很有⽤的⼿段。

        堆提供 malloc( ) , calloc( ) 和 realloc( ) 等函数获取内存空间的⼀块内存。下⾯采⽤对⽐的形式分别介绍堆和栈的作⽤,以及它们的区别。

二、解答

1. 堆和栈的作⽤

        (1)栈的内存管理严格遵循先进后出的顺序,即释放栈中对象所占内存时的顺序刚好与为这些对象分配栈中内存时的顺序相反,这⼀点正是实现函数调⽤所需要的。从栈中分配内存效率特别⾼,C语⾔编译程序能产⽣如此好的代码的原因之⼀就是充分利⽤了栈。

        (2)从堆中获取内存⽐从栈中获取内存要慢得多,但是堆的内存管理却⽐栈灵活得多。任何时候都可以从堆中获取内存,⽽且在释放堆中对象所占内存时,可以按任意顺序进⾏。数据对象使⽤栈中内存⽐使⽤堆中内存程序运⾏更快。但是,有时候使⽤堆中内存可以改善⼀种算法,从⽽使它更快,或者更灵活,因此使⽤堆或栈要折中考虑。

2. 堆和栈的区别

        在了解了堆和栈各⾃的⽤途后,从两者的申请⽅式、申请后系统的响应、申请⼤⼩的限制、申请效率的⽐较和存储内容各⽅⾯了解它们的实质区别。

        (1)申请⽅式

        栈是由系统⾃动分配。如声明在函数中的⼀个局部变量 “int i;”,系统会⾃动在栈中为 i 开辟内存空间。⽽堆是程序员⾃⼰申请,同时指明⼤⼩。在C语⾔中,堆提供 malloc( ) ,calloc( ) 和 realloc( ) 等函数获取内存空间的⼀块内存,如 “ buffer=(int*)malloc(256) ”是为 buffer 分配了⼀个256 字节⼤⼩的 int 型内存空间。

        (2)申请后系统的响应

        只要栈的剩余空间⼤于所申请空间,系统将为程序提供内存,否则将报异常,提示栈溢出。⽽堆则是⾸先确定操作系统有⼀个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历此链表,寻找第⼀个⼤于所申请空间的堆结点, 然后将该结点从空闲结点链表中删除,并将该结点的控件分配给程序。

        (3)申请⼤⼩的限制

        在 windows 下,栈是向低地址扩展的数据结构,是⼀块连续的内存区域。它的最⼤容量是预先规定好的,如果申请的空间超过栈剩余的空间,将会提示溢出,能从栈获得的空间较⼩。⽽堆是向⾼地址扩展的数据结构,是不连续的内存区域。

        这是因为系统是⽤链表来存储空闲内存地址的,⽽链表的遍历⽅向是由低地址向⾼地址, 堆的⼤⼩受限于计算机系统中有效的虚拟内存。因此,堆获得的空间⽐较灵活,也⽐较⼤。

        (4)申请效率

        在申请⽅式中,已经得知栈是由系统⾃动分配的,速度⽐较快,不容易控制。⽽堆是由 new 分配的内存,速度⽐较慢,⽤起来较⽅便。

        (5)存储内容

        在函数调⽤时,第⼀个进栈的是主函数中的下⼀条指令(函数调⽤语句的下⼀条可执⾏语句)的地址,然后是函数的各个参数。在⼤多数 C 编译器中,参数是由右往左⼊栈的,然后是函数中的局部变量。

        注意,静态变量是不⼊栈的。当本次函数调⽤结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是 主函数中的下⼀条指令,程序由该点继续运⾏。⽽堆⼀般是在堆的头部⽤⼀个字节存放堆的⼤⼩,堆中的具体内容由程序员安排。

三、总结

        通过对栈和堆的⽐较,⼤致了解了堆和栈的区别,以及⽤途。其实,栈和堆的关系可以理解为机洗⾐服和⼿洗⾐服。全⾃动洗⾐机洗⾐服,将所有的脏⾐服放进去,倒上⽔, 放上洗⾐液就可以了。这样很便捷,但是灵活度和⾃由度较⼩。⼿洗⾐服虽然很累,但是可以将⾃⼰认为⽐较脏的局部地⽅多洗洗或分类洗,灵活度较⼤。

相关推荐

  1. C语言区别什么

    2024-05-14 13:44:04       10 阅读
  2. 什么什么?他们之间从区别联系

    2024-05-14 13:44:04       15 阅读
  3. 区别

    2024-05-14 13:44:04       34 阅读
  4. C++中内存定义以及区别

    2024-05-14 13:44:04       5 阅读
  5. C语言C++实现Stack对比,有什么区别

    2024-05-14 13:44:04       19 阅读
  6. 【数据结构】区别

    2024-05-14 13:44:04       15 阅读
  7. C语言】(13)

    2024-05-14 13:44:04       32 阅读
  8. C语言内存管理以及空间空间区别

    2024-05-14 13:44:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-14 13:44:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-14 13:44:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-14 13:44:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-14 13:44:04       18 阅读

热门阅读

  1. 设计模式-11 - Adapter Pattern 适配器设计模式

    2024-05-14 13:44:04       8 阅读
  2. uniapp经验

    2024-05-14 13:44:04       12 阅读
  3. 安卓源码去掉混淆

    2024-05-14 13:44:04       11 阅读
  4. Figma host相关设置

    2024-05-14 13:44:04       9 阅读
  5. 使用feign调用媒资服务完成静态页面的上传

    2024-05-14 13:44:04       10 阅读
  6. vue2 el-tree树形下拉框

    2024-05-14 13:44:04       9 阅读
  7. RateLimiter 限流算法使用

    2024-05-14 13:44:04       8 阅读