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

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段 (未初始化数据)                                               ││    ├─ 未初始化全局变量                                                ││    └─ 未初始化静态变量                                                ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  数据段 (已初始化数据)                                              ││    ├─ 已初始化全局变量                                                ││    └─ 已初始化静态变量                                                ││                                                                 │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  代码段 (可执行指令)                                                ││    ├─ 函数体                                                        ││    └─ 字面量字符串                                                    ││                                                                 │└─────────────────────────────────────────────────────────────────┘ 低地址
http://www.xdnf.cn/news/6526.html

相关文章:

  • MySQL高可用
  • GEE计算 RSEI(遥感生态指数)
  • 无损耗协议:PROFINET和EtherNet IP网关的高效安装指南
  • SSH主机密钥验证失败:全面解决方案与技术手册
  • 2025-5-16Vue3快速上手
  • 填孔即可靠:猎板PCB如何用树脂塞孔重构高速电路设计规则
  • 从前序与中序遍历序列构造二叉树(中等)
  • 【linux】Web服务—搭建nginx+ssl的加密认证web服务器
  • Ubuntu快速安装Python3.11及多版本管理
  • 项目版本管理和Git分支管理方案
  • Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)
  • 计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
  • SpringCloud微服务开发与实战
  • 官方 Elasticsearch SQL NLPChina Elasticsearch SQL
  • [特殊字符][特殊字符]知识库PHP版 | ChatMoneyAI宝塔面板Docker多部署
  • Java EE初阶——wait 和 notify
  • CentOS高手之路:从进阶实战到企业级优化
  • 维智定位 Android 定位 SDK
  • 网站运维基础 | 2. cms介绍及wordpress的搭建
  • 物联网中的WiFi模式解析:AP、STA与混合模式
  • 【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度
  • 还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍
  • 聊聊redisson的RLock的unlock
  • Java微服务架构实战:Spring Boot与Spring Cloud的完美结合
  • Linux 内核中 inet_accept 的实现与自定义传输协议优化
  • 在哪一个终端下运行有影响吗?pip install pillow
  • eVTOL、无人机电机功耗图和电机效率图绘制测试
  • Mendix 中的XPath 令牌(XPath Tokens)详解
  • 低空态势感知:基于AI的DAA技术是低空飞行的重要安全保障-机载端地面端
  • C++ Lambda 表达式介绍