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

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

执行过程

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

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

    运行前

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

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

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

    运行后

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

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

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

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

    你可能感兴趣的文章
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    Osgi环境配置
    查看>>
    OSG中找到特定节点的方法(转)
    查看>>
    OSG学习:C#调用非托管C++方法——C++/CLI
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>