1. 内存模型概述
C++内存模型是理解程序如何与计算机内存交互的核心概念。它定义了数据如何存储、访问以及不同部分之间的交互规则。现代C++内存模型主要包含以下几个关键方面:
- 对象存储位置:栈、堆、全局/静态存储区等
- 生命周期管理:自动、静态、动态和线程局部存储期
- 访问规则:对齐、原子性、内存序等
- 多线程交互:可见性、顺序一致性等
2. 内存分区详解
2.1 五大经典内存区域
#include <iostream>
int global_var = 10; // 全局/静态存储区
static int static_global = 20; // 全局/静态存储区
void foo() {
static int static_local = 30; // 全局/静态存储区(局部作用域)
int local_var = 40; // 栈区
int* heap_var = new int(50); // 堆区
const char* str = "Hello"; // 常量区
std::cout << global_var << static_global << static_local
<< local_var << *heap_var << str << std::endl;
delete heap_var;
}
内存布局示例:
+------------------+
| 代码区 | // 程序指令
+------------------+
| 常量区 | // "Hello"等字面量
+------------------+
| 全局/静态存储区 | // global_var, static_global, static_local
+------------------+
| 堆区 | // new/malloc分配的内存(向上增长)
| ↓ |
| |
| ↑ |
| 栈区 | // 局部变量(向下增长)
+------------------+
2.2 各区域特性对比
内存区域 | 存储内容 | 生命周期 | 分配/释放 | 大小限制 |
---|---|---|---|---|
栈(stack) | 局部变量、函数参数等 | 自动(函数调用) | 编译器自动管理 | 较小(通常几MB) |
堆(heap) | 动态分配内存 | 手动控制 | new/delete | 系统内存上限 |
全局/静态存储区 | 全局/静态变量 | 程序运行期 | 编译时确定 | 系统内存上限 |
常量区 | 字符串常量、const变量等 | 程序运行期 | 编译时确定 | 系统内存上限 |
代码区 | 程序指令 | 程序运行期 | 编译时确定 | 系统内存上限 |
3. 对象内存布局
3.1 基本类型内存占用
// 32位系统下典型大小
std::cout << "bool: " << sizeof(bool) << " bytes\n"; // 1
std::cout << "char: "