C++ 内存模型

+----------------------+ 高地址
|    栈区 (Stack)      |
+----------------------+
|    堆区 (Heap)       |
+----------------------+
|  BSS段 (未初始化数据) |
+----------------------+
|  数据段 (已初始化数据)|
+----------------------+
|    代码段 (Text)     |
+----------------------+ 低地址
 

1. 栈区(Stack)

  • 栈区主要存储局部变量、函数调用的参数和返回地址。
  • 栈是由系统自动管理的,它的内存分配和释放速度非常快。
  • 栈的特点是 "后进先出"(LIFO),函数调用时,新的栈帧会压入栈顶,函数返回时会将栈帧弹出。
  • 栈区的内存大小是有限的,因此局部变量和递归的层数都有一个最大限制。

2. 堆区(Heap)

  • 堆区用于动态内存分配,程序运行时可以通过 newmalloc 函数动态分配内存,使用 deletefree 释放内存。
  • 堆区由程序员手动管理,不同于栈区自动管理,堆内存的使用更加灵活,但是也更容易出现内存泄漏和内存碎片问题。
  • 堆的内存分配相对较慢,因为操作系统需要找到合适的内存块,并在释放时可能需要进行合并操作。

3. 数据段(Data Segment)

  • 数据段又分为两部分:
    • 全局数据段(静态数据段): 存放初始化的全局变量和静态变量(static 变量),这些变量在程序整个生命周期中保持在内存中。
    • BSS 段: 存放未初始化的全局变量和静态变量,这些变量在程序加载时会被初始化为 0。
  • 数据段的内存由操作系统在程序启动时分配,程序结束时释放。

4. 代码段(Code Segment 或 Text Segment)

  • 代码段存放程序的可执行代码,也称为 文本段,这是程序指令所在的内存区域。
  • 代码段通常是只读的,防止程序意外修改指令。
  • 程序执行时,CPU 从代码段取指令,逐条执行。

5.栈和堆的主要区别:


1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。
2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)。
3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。
4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。
5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。
6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值