博客
关于我
C/C++堆栈的区别
阅读量:804 次
发布时间:2019-03-25

本文共 1229 字,大约阅读时间需要 4 分钟。

关于程序内存的分区与堆栈的区别

程序内存的分区与堆栈的关系一直是计算机科学中广泛讨论的话题。本文将从内存分区以及堆栈与堆的核心区别两个方面展开分析。

首先,程序内存的分区。程序运行时,系统会将内存划分为几个不同的区域:

  • 栈空间(Stack Space):主要存储函数的参数、局部变量等。在函数调用时,程序会将函数返回地址、函数参数以及局部变量等内容依次入栈。栈分配和释放是自动完成的,编译器会根据函数调用栈的深度自动负责内存的分配与释放。

  • 堆空间(Heap Space):由程序员直接使用malloc、new等函数申请的内存区域。堆分配具有较大的灵活性,但缺少自动管理,程序员需要手动释放,否则可能造成内存泄漏。

  • 全局区(Global Zone,Static Region):共享于多个函数的内存区域。这里包含了两个子区:

    • BSS区(Uninitialized Global/Static Variables):存储在程序运行时未被初始化的全局或静态变量,值为0。
    • Data区(Initialized Global/Static Variables):存储已经初始化的全局或静态变量(非const类型)。
  • 文字常量区(Rodata):存储字符串、const修饰的变量等静态数据。

  • 程序代码区(Text):存储函数的二进制代码。

  • 接下来,我们具体探讨堆栈的区别:

    一、申请方式

    • 栈空间:编译器自动分配和释放内存。
    • 堆空间:程序员通过malloc、新等函数手动分配。堆空间在程序结束时会由系统自动释放(未释放则可能导致内存泄漏)。

    二、系统响应

    • 栈空间:在申请内存时,系统仅检查是否有足够的空间。若栈空间不足,可能引发栈溢出错误。
    • 堆空间:采用空闲内存地址链表进行管理。在申请时,系统需要从链表中找到符合要求的最小空闲块,并将该块记录="'.$".用于追踪内存的分配状态。

    三、空间应用范围

    • 栈空间:在Windows操作系统中,通常采用连续内存页,大小固定且相对于堆空间较小。
    • 堆空间:支持非连续内存分配,主要依赖于系统的虚拟内存管理。堆空间内存的分配更灵活,且大小受限于系统的有效虚拟内存容量。

    四、申请效率

    • 栈空间:分配效率较高,自动化处理,存在空间碎片的少量风险。
    • 堆空间:手动分配程序员控制,分配速度较慢,容易导致内存碎片,但对于大型程序来说,提供了更高的灵活性。

    五、存储内容

    • 堆空间:堆头部常以一个字节记录所分配内存的大小,方便释放。堆的入栈顺序为函数返回地址 -> 函数形参(自右向左) -> 局部变量(静态变量不入栈)。
    • 栈空间:仅存储函数调用时所需的临时数据。

    六、存取效率

    • 栈:运行效率更高,访问速度快。
    • 堆:因为内存分配与释放过程复杂,访问速度较慢。

    通过以上对比可以看出,堆与栈各有千秋。堆适合需要灵活内存分配但带来内存管理负担的大型应用,而栈则在函数调用、递归等场景中表现出色。程序开发者在具体应用中需要根据需求选择合适的内存管理方式。

    转载地址:http://uzdyk.baihongyu.com/

    你可能感兴趣的文章
    Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务
    查看>>
    PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
    查看>>
    PHP系列:使用PHP实现登录注册功能的完整指南
    查看>>
    Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效)
    查看>>
    Python&aconda系列:conda踩坑记录2.UnsatisfiableError: The following specifications were found to be incompa
    查看>>
    Python&aconda系列:Jupyter Notebook快速上手、深度学习库PyTorch安装
    查看>>
    Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from
    查看>>
    python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向)
    查看>>
    python&anconda系列(亲测有效):tensorflow AttributeError: ‘str’ object has no attribute ‘decode’
    查看>>
    python&anconda系列:tf.keras.backend.get_session()和keras.backend.get_会话()返回不同的会话对象(待解答)
    查看>>
    "WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
    查看>>
    #if 0 #elif 1 #else #endif 用法
    查看>>
    #include <gdiplus.h>出错
    查看>>
    $ajax({}).done 和 $ajax({}) success 区别
    查看>>
    'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
    查看>>
    (反射+内省机制的运用)处理jdbc的结果集
    查看>>
    (反射+内省机制的运用)简单模拟spring IoC容器的操作
    查看>>
    #C8# UVM中的factory机制 #S8.2.3# 重载 component 哪些情形
    查看>>
    (转)SQLServer全局变量
    查看>>
    (转)tomcat7.0 manager app和host manager web管理
    查看>>