博客
关于我
程序的内存分区模型
阅读量:134 次
发布时间:2019-02-28

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

执行过程

在编译过程中,程序的执行可以分为几个关键阶段:
  • 预处理阶段:这一阶段主要包括宏定义展开、头文件处理以及条件编译。需要注意的是,预处理阶段不会对语法进行检查,这通常是编译阶段的任务。
  • 编译阶段:预处理完成后,编译器会对处理后的源代码进行语法检查,并将其转换为汇编语言文件。
  • 汇编阶段:汇编语言文件会被转换为目标文件(通常是二进制文件)。
  • 链接阶段:目标文件会被链接起来,生成最终的可执行程序。
  • 内存分区

    程序在运行时,内存会被划分为不同的区域,这些区域在功能上有明确的区别:
    • 代码区:存储程序的代码和常量。
    • 数据区:存储全局变量(已初始化和未初始化的)。
    • 栈区:用于函数调用的本地存储,属于先进后出的数据结构,由编译器自动管理。
    • 堆区:由程序员动态分配和释放,容量通常远大于栈区。

    运行前

    在程序运行之前,内存的分配情况如下:
    • 代码区

      • 共享内存:用于多个进程共享。
      • 只读内存:通常用于存放只读数据,如常量。
    • 数据区

      • 已初始化的全局变量和静态变量:在程序启动时就被分配了内存。
      • 未初始化的全局变量和静态变量:在程序运行时才会被分配内存。

    运行后

    程序运行后,内存的使用情况会发生变化:
    • 栈区

      • 栈是先进后出的数据结构,适合用于函数调用时的本地存储。
      • 栈中的变量会在函数结束后自动释放。
    • 堆区

      • 堆区的容量远大于栈区,且没有先进后出的特性。
      • 堆内存的分配和释放需要程序员主动管理,常见的方法是使用mallocfree函数。
      • 需要注意的是,堆内存如果没有正确释放,可能会导致内存泄漏。

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

    你可能感兴趣的文章
    Page Object模式:为什么它是Web自动化测试的必备工具
    查看>>
    SpringBoot中重写addCorsMapping解决跨域以及提示list them explicitly or consider using “allowedOriginPatterns“ in
    查看>>
    PageHelper 解析及实现原理
    查看>>
    pageHelper分页工具的使用
    查看>>
    pageHelper分页技术
    查看>>
    PageHelper分页查询遇到的小问题
    查看>>
    SpringBoot中配置为开发模式,代码修改后不用重新运行
    查看>>
    springboot中pom.xml、application.yml、application.properties
    查看>>
    PageHelper:上手教程(最详细)
    查看>>
    PageOffice如何实现从零开始动态生成图文并茂的Word文档
    查看>>
    PageRank算法
    查看>>
    Paint类(画笔)
    查看>>
    paip.android 手机输入法制造大法
    查看>>
    paip.spring3 mvc servlet的配置以及使用最佳实践
    查看>>
    Palindrome Number leetcode java
    查看>>
    Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
    查看>>
    Palo Alto Networks Expedition 远程命令执行漏洞(CVE-2024-9463)
    查看>>
    Palo Alto Networks PAN-OS身份认证绕过导致RCE漏洞复现(CVE-2024-0012)
    查看>>
    Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现
    查看>>
    Springboot中@SuppressWarnings注解详细解析
    查看>>