当前位置: 首页 > news >正文

进程内存分布--之理论知识

一个由C/C++编译的程序占用的内存分为以下几个部分 :

1、栈区(stack):由编译器自动分配释放 ,存放函数调用函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap):一般由程序员分配释放,如malloc 来分配的全局指针。若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。 

4、文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放。 

5、程序代码区:存放函数体的二进制代码。

  • 进程内存分布总结如下:
  • - 程序段 (Text Segment):可执行文件代码的内存映射
    • 程序代码在内存中的映射,存放函数体的二进制代码。
    • 可执行代码、字符串字面值、只读变量
  • - 数据段 (Data Segment):可执行文件的已初始化全局变量的内存映射
    • 在程序运行初已经对变量进行初始化的数据。
    • 已初始化且初值非0的全局变量和局部静态变量,全局静态变量,常量
  • - BSS段 (BSS Segment):未初始化的全局变量或者静态变量(用零页初始化)
    • 在程序运行初未对变量进行初始化的数据。
    • 未初始化或初值为0的全局变量和静态局部变量
  • - 堆区 (Heap) : 存储动态内存分配,匿名的内存映射
    • 存储动态内存分配,需要程序员手工分配,手工释放.
    • 注意它与数据结构中的堆是两回事,分配方式类似于链表
  • - 栈区 (Stack) : 进程用户空间栈,由编译器自动分配释放,存放函数的参数值、局部变量的值等
    • 存储局部、临时变量,函数参数
    • 函数调用时,存储函数的返回指针,用于控制函数的调用和返回。
    • 在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
    • 但不包括static声明的变量, static 意味着 在“数据段”中 存放变量
  • - 映射段(Memory Mapping Segment):任何内存映射文件
    • 内核将文件的内容直接映射到内存
    • 内存映射是一种方便高效的文件I/O方式,所以它被用来加载动态库。创建一个不对应于任何文件的匿名内存映射也是可能的,此方法用于存放程序的数据。
    • 该区域用于映射可执行文件用到的动态链接库。

         Linux 对进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下:图示如下:

相关文章:

  • 中钧科技通过数字赋能,编织“数字互联网”助力数字化进程!
  • SSM整合实战
  • 手搓多模态-03 顶层和嵌入层的搭建
  • 玄机-应急响应-入侵排查
  • 图解AUTOSAR_SWS_FlexRayARTransportLayer
  • 性能问题排查工具介绍
  • 移动应用开发实验室2024二面纳新题复盘
  • 【家政平台开发(20)】系统监控与日志管理设计:稳固运行的基石
  • 【内网安全】DHCP 饿死攻击和防护
  • [特殊字符] 驱动开发硬核特训 · Day 4
  • Vue3响应式引擎解密:从依赖追踪到性能调优的深度之旅
  • 微服务系统记录
  • Java 数组与 ArrayList 核心区别解析:从源码到实战!!!
  • 远距离无线网络传输设备-网桥(1/5/15 km)
  • C++Primer - 动态内存管理
  • 优选算法的妙思之流:分治——归并专题
  • 静态库与动态库
  • 整理一些大模型部署相关的知识
  • 对责任链模式的理解
  • 7.4 SVD 的几何背景
  • 建设部网站进不去/临沂百度公司地址
  • 海口有做棋牌娱乐网站的吗/数据分析师报考条件
  • 动态ip如何做网站/临沂seo排名外包
  • 南阳做网站的公/惠州seo外包费用
  • 网站脚本错误/长沙网站seo方法
  • 扬中网站建设价格/广州网站推广联盟