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

C++动态内存分配

内存管理

  • 1.代码段(Code Segment / Text Segment)常量区
  • 2. 数据段(Data Segment)静态区
  • 3. BSS 段(未初始化数据段)
  • 4. 堆(Heap)
  • 5. 栈(Stack)
  • 6. 内存映射段(Memory Mapping Segment)
    • 对比总结
    • 内存布局示意图

在这里插入图片描述

1.代码段(Code Segment / Text Segment)常量区

  1. 功能
    存储程序的可执行机器指令,包括函数体、控制流逻辑和操作码。
  2. 特性
    只读且固定:防止程序意外修改自身代码,确保执行安全。
    共享性:多个进程可共享同一份代码(如操作系统内核、共享库)。
    编译时确定:大小和内容在编译阶段固化,运行时不可变。
  3. 存储内容
    函数定义和实现。
    字面量字符串(如 “Hello, World!”)。
    指令操作码(如加法、跳转指令)。

2. 数据段(Data Segment)静态区

  1. 功能
    存储已初始化的全局变量和静态变量。
  2. 特性
    读写区域:程序运行时可修改变量值。
    初始化值:变量值来自编译时的显式赋值。
    持续性:生命周期贯穿程序运行始终。
  3. 存储内容
    已初始化的全局变量(如 int global = 42;)。
    已初始化的静态变量(如 static int count = 0;)。
    全局 / 静态数组(如 char msg[] = “Hi”;)。

3. BSS 段(未初始化数据段)

  1. 功能
    存储未初始化的全局变量和静态变量。
  2. 特性
    零初始化:运行时自动初始化为 0(或空指针)。
    不占磁盘空间:仅在内存中分配,减少可执行文件大小。
    读写区域:与数据段相同,但初始值不同。
  3. 存储内容
    未初始化的全局变量(如 int global;)。
    未初始化的静态变量(如 static int temp;)。
    全局 / 静态数组(如 char buffer[1024];)。

4. 堆(Heap)

  1. 功能
    动态分配内存,用于运行时创建对象(如 malloc/new),堆是向上增长的。
  2. 特性
    手动管理:程序员负责申请(malloc/new)和释放(free/delete)。
    动态扩展:通过系统调用(如 brk/mmap)调整大小。
    碎片化风险:频繁分配 / 释放可能导致内存碎片,降低利用率。
    较大空间:理论上限为虚拟地址空间(如 64 位系统的 16EB)。
  3. 存储内容
    动态分配的对象(如 int* ptr = new int[100];)。
    运行时创建的数据结构(如链表、树)。
    共享内存区域(通过 shm_open 等 API 创建)。

5. 栈(Stack)

  1. 功能
    存储函数调用上下文和局部变量,实现函数调用栈。栈是向下增长的。
  2. 特性
    后进先出(LIFO):由操作系统自动管理,通过栈指针(SP)操作。
    快速访问:通过寄存器直接操作栈顶,速度快于堆。
    自动回收:函数返回时自动释放内存,无需手动管理。
    固定大小:默认栈深度有限(如 Linux 默认 8MB),可能导致栈溢出。
  3. 存储内容
    局部变量(如 int x = 10;)。
    函数参数(如 void func(int a, int b) 的 a 和 b)。
    调用帧信息(返回地址、寄存器值、栈基址)。
    临时变量(如函数内的计算结果)。

6. 内存映射段(Memory Mapping Segment)

  1. 功能
    将文件或设备映射到进程地址空间,实现高效 I/O 和共享内存。
  2. 特性
    文件映射:通过 mmap() 将文件内容直接映射到内存,避免拷贝。
    共享内存:多个进程可映射同一文件,实现进程间通信(IPC)。
    动态加载:用于加载共享库(如 .so 文件)。
    虚拟内存:仅在访问时实际分配物理内存,节省资源。
  3. 存储内容
    动态链接库(如 libc.so)。
    通过 mmap() 映射的文件(如配置文件、数据库)。
    匿名内存映射(如 MAP_ANONYMOUS 创建的临时缓冲区)。
    共享内存对象(如 POSIX 共享内存)。

对比总结

区域存储内容生命周期分配方式访问速度风险/注意事项
代码段可执行指令、字面量字符串程序运行期间编译时静态分配最快不可修改(修改会触发段错误)
数据段已初始化全局/静态变量程序运行期间编译时静态分配持续占用内存
BSS段未初始化全局/静态变量程序运行期间运行时零初始化自动清零,节省磁盘空间
动态分配的对象(malloc/new手动管理(free/delete运行时系统调用(sbrk/mmap较慢内存泄漏、碎片化、需手动释放
局部变量、函数调用帧函数执行期间自动分配/回收(SP指针)最快栈溢出(Stack Overflow)
内存映射段文件映射、共享库、匿名映射手动管理(munmap运行时系统调用(mmap中等需处理映射错误、同步问题

内存布局示意图

高地址 ──────────────────────────────────────────────────────────────────│                                                                 ││  命令行参数和环境变量                                             │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  栈 (向下增长)                                                    ││    ├─ 函数调用帧                                                   ││    ├─ 局部变量                                                     ││    └─ ...                                                         ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  内存映射段                                                        ││    ├─ 文件映射                                                      ││    ├─ 共享库                                                        ││    └─ 匿名映射                                                      ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  堆 (向上增长)                                                     ││    ├─ 动态分配的对象                                                 ││    └─ ...                                                         ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  BSS段 (未初始化数据)                                               ││    ├─ 未初始化全局变量                                                ││    └─ 未初始化静态变量                                                ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  数据段 (已初始化数据)                                              ││    ├─ 已初始化全局变量                                                ││    └─ 已初始化静态变量                                                ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  代码段 (可执行指令)                                                ││    ├─ 函数体                                                        ││    └─ 字面量字符串                                                    ││                                                                 │└─────────────────────────────────────────────────────────────────┘ 低地址

相关文章:

  • 【AI面试秘籍】| 第11期:大模型“复读机“难题的破局之道
  • Vue百日学习计划Day9-15天详细计划-Gemini版
  • STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析
  • 如何有效的开展接口自动化测试?
  • 面试题:详细分析Arraylist 与 LinkedList 的异同
  • 【Spring AI】本地大模型接入MCP实现联网搜索
  • 综合项目:博客
  • Python之三大基本库——Matplotlib
  • 对称二叉树的判定:双端队列的精妙应用
  • 源码:处理文件格式和字符集的相关代码(3-3)
  • Spring WebFlux与Quarkus实战:云原生微服务开发的两大主流框架深度解析
  • 一分钟了解机器学习
  • Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
  • 割点与其例题
  • 消防应急处置管理的全流程概述
  • NLP双雄争霸:GPT与BERT的生成-理解博弈——从技术分野到产业融合的深度解码
  • C++:单例模式
  • 【数据仓库面试题合集①】数据建模高频面试题及解析
  • 索恩格汽车SEG Automotive EDI 需求分析
  • Unity3D 游戏编程内存优化技巧
  • 降水较常年同期少五成,安徽四大水利工程调水超11亿方应对旱情
  • 选址江南制造总局旧址,上海工业博物馆建设有新进展
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头
  • “80后”北京市东城区副区长王智勇获公示拟任区委常委
  • 国新办将就2025年4月份国民经济运行情况举行新闻发布会
  • 将人工智能送上太空,我国太空计算卫星星座成功发射