【GL011】C++内存分区及堆栈区别详解

embedded/2025/3/31 21:01:30/

1. 内存分区

程序运行时,内存通常分为以下几个区域:

  1. 代码区(Text Segment)

    • 存储内容:程序的执行代码(机器指令)。
    • 特点:只读,防止程序被意外修改。
  2. 数据区(Data Segment)

    • 存储内容:已初始化的全局变量、静态变量(包括静态局部变量和静态全局变量)。
    • 特点:在程序启动时分配并初始化,生命周期持续到程序结束。
  3. BSS段(Block Started by Symbol)

    • 存储内容:未初始化的全局变量和静态变量。
    • 特点:程序启动时自动初始化为零或空指针,生命周期同数据区。
  4. 堆(Heap)

    • 存储内容:动态分配的内存(如 malloc/new 申请的内存)。
    • 特点
      • 手动管理(需显式释放 free/delete)。
      • 内存不连续,可能产生碎片。
      • 大小受系统虚拟内存限制。
  5. 栈(Stack)

    • 存储内容:函数调用时的局部变量、参数、返回地址等。
    • 特点
      • 自动管理(由编译器分配/释放)。
      • 内存连续,高效但大小有限(如 Linux 默认 8MB)。
      • 栈溢出会导致程序崩溃(如无限递归)。
  6. 内存映射段(Memory Mapping Segment)

    • 存储内容:动态链接库、文件映射(如 mmap 映射的文件)。
    • 特点:由操作系统管理,常用于共享内存或高效文件 I/O。

2. 堆与栈的核心区别

特性堆(Heap)栈(Stack)
管理方式手动分配/释放(如 malloc/free自动分配/释放(编译器管理)
内存分配效率低(需动态查找可用内存)高(仅移动栈指针)
碎片问题可能产生外部/内部碎片无碎片(后进先出结构)
内存大小受系统虚拟内存限制固定大小(如 Linux 默认 8MB)
访问速度慢(需指针寻址)快(连续内存,寄存器操作)
生命周期由程序员控制随函数调用结束自动释放
典型场景动态数据结构(链表、树)局部变量、函数调用上下文

3. 各分区存储内容总结

内存分区存储内容生命周期管理方式
代码区程序指令(二进制代码)程序运行期间操作系统
数据区已初始化的全局变量、静态变量程序启动到结束编译器
BSS段未初始化的全局变量、静态变量程序启动到结束编译器
动态分配的内存块程序员手动控制程序员
局部变量、函数参数、返回地址函数调用期间编译器
内存映射段动态库、文件映射程序运行期间(可手动释放)操作系统

4. 常见问题示例

  1. 栈溢出(Stack Overflow)

    void recursive_func() {int buffer[1024]; // 每次递归消耗约 4KB 栈空间recursive_func(); // 无限递归导致栈溢出
    }
  2. 堆内存泄漏(Heap Leak)

    void leak_memory() {int *ptr = malloc(100 * sizeof(int)); // 分配后未释放// 函数结束,ptr 指针丢失,内存无法回收
    }
  3. 全局变量与静态变量

    int global_var = 10;          // 数据区
    static int static_var;         // BSS段(未初始化)
    void func() {static int local_static = 5; // 数据区(初始化)
    }

5. 总结

  • 代码区、数据区、BSS段:静态分配,生命周期长,由编译器/操作系统管理。
  • :动态分配,灵活但需手动管理,适合大内存需求。
  • :高效自动管理,适合局部变量和函数调用。
  • 内存映射段:特殊用途,如共享库和文件操作。

理解内存分区和堆栈区别,有助于优化程序性能、避免内存错误(如泄漏、溢出),并合理设计数据结构。


http://www.ppmy.cn/embedded/177498.html

相关文章

算法 | 2024最新算法:鳑鲏鱼优化算法原理,公式,应用,算法改进研究综述,matlab代码

2024最新鳑鲏鱼优化算法(BFO)研究综述 鳑鲏鱼优化算法(Bitterling Fish Optimization, BFO)是2024年提出的一种新型群智能优化算法,受鳑鲏鱼独特的繁殖行为启发,通过模拟其交配、产卵和竞争机制进行全局优化。该算法在多个领域展现出优越性能,尤其在解决复杂非线性问题中…

git 问题 master has no tracked branch

以下是解决 master has no tracked branch 问题的步骤总结: 1. ‌拉取远程分支并允许不相关历史记录‌ 当本地与远程仓库历史不关联时,执行以下命令强制拉取并合并: bashCopy Code git pull origin master --allow-unrelated-histories 此…

在我的电脑上构建ollama+deepseek-r1-7b运行环境;

这里写自定义目录标题 一、环境准备(20分钟)1.1 系统要求1.2 基础依赖安装 二、Ollama安装配置 Windows(PowerShell管理员模式)三、DeepSeek模型部署3.1 下载模型文件3.2 创建Modelfile3.3 构建模型 四、运行测试4.1 启动模型4.2 …

深度学习框架PyTorch——从入门到精通(10)PyTorch张量简介

这部分是 PyTorch介绍——YouTube系列的内容,每一节都对应一个youtube视频。(可能跟之前的有一定的重复) 创建张量随机张量和种子张量形状张量数据类型 使用PyTorch张量进行数学与逻辑运算简单介绍——张量广播关于张量更多的数学操作原地修改…

【MySQL数据库】MySQL 主从复制检查方式

1. 在从库检查复制状态 在从库(Slave)上执行: SHOW SLAVE STATUS\G;关注以下关键字段: Slave_IO_Running: Yes → I/O 线程是否正常 Slave_SQL_Running: Yes → SQL 线程是否正常 Seconds_Behind_Master: 0 → 复制延迟时间&…

QT原子变量:QAtomicInteger、QAtomicPointer、QAtomicFlag

引言:原子变量为何重要? 在多线程编程中,共享数据的原子性访问是保证线程安全的核心。传统互斥锁虽然有效,但会带来性能损耗和死锁风险。QT提供的原子类型(QAtomicInteger、QAtomicPointer、QAtomicFlag)通…

旅游纵览杂志旅游纵览杂志社旅游纵览编辑部2025年第2期目录

聚焦 江苏省乡村振兴与乡村旅游耦合协调发展研究 丁美琴;刘慧;阚玉金;董琪; 1-3 乡村振兴战略背景下东海县文旅产业创新发展路径 李超; 4-6 乡村振兴视角下的云南农文旅融合发展 凌莉; 7-930 深度涉足 博斯腾湖景区旅游形象感知研究 谭欣怡; 10-13 涞滩古镇…

批量修改 PPT 文档中主题、编辑时长、来源等元数据信息

每一个 PPT 文档被创建之后,都会包含一些元数据信息。这些元数据信息记录着文件的作者、创建时间、修改时间、打印时间等信息。这些信息默认都是自动生成的,如果我们想要对这些元数据进行修改,当然也是可以的。今天就给大家介绍一下如何批量修…