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

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

执行过程

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

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

    运行前

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

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

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

    运行后

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

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

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

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

    你可能感兴趣的文章
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm切换到淘宝源
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm和yarn的使用对比
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NR,NF,FNR
    查看>>
    nrf开发笔记一开发软件
    查看>>
    NSDateFormatter的替代方法
    查看>>
    nsis 安装脚本示例(转)
    查看>>
    NSOperation基本操作
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    Nuget~管理自己的包包
    查看>>
    nullnullHuge Pages
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>