C++内存模型
内存分区
C++程序在执行时,将内存大方向划分为4个区域:
- 代码区:存放函数体的二进制代码,由操作系统进行管理的
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
程序运行前后的内存分配
程序运行前
在程序启动但还未正式运行前,操作系统将开辟一段内存空间,加载程序并为内存进行分区,存放程序运行需要的不同数据。
在程序正式运行前,主要分为两个区域:
- 代码区: 存放 CPU 执行的机器指令。代码区有以下特点:
- 共享:代码区内的数据可以被公开访问,使得对于频繁被执行的程序,只需要在内存中有一份代码即可,提高内存利用率,避免浪费。
- 只读:防止程序代码被篡改
- 全局区:存放全局变量、静态变量和字符串以及由const修饰的常量。全局区内存在程序运行结束后由操作系统自动释放。
程序运行时
在程序正式运行时,操作系统又会新开辟两个内存空间,分别是栈区和堆区。主要用于存放程序运行时产生的数据。
- 栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等。
- 堆区:由程序员手动分配释放,例如使用new操作符创建对象时,开辟的就是堆内存。
验证
#include using namespace std;// 全局变量int global_variable_a = 100;int global_variable_b = 200;// 全局常量const int global_constant_a = 100;const int global_constant_b = 200;// 全局静态变量static int global_static_a = 100;static int global_static_b = 200;int main() {// 局部变量int a = 100;int b = 200;// 局部静态变量static int static_a = 100;static int static_b = 200;// new操作符开辟的内存int* new_a = new int(100);int* new_b = new int(200);cout << "全局变量内存区:" << &global_variable_a << endl;cout << "全局变量内存区:" << &global_variable_b << endl;cout << endl;cout << "全局常量内存区:" << &global_constant_a << endl;cout << "全局常量内存区:" << &global_constant_b << endl;cout << endl;cout << "全局静态内存区:" << &global_static_a << endl;cout << "全局静态内存区:" << &global_static_b << endl;cout << endl;cout << "局部变量内存区:" << &a << endl;cout << "局部变量内存区:" << &b << endl;cout << endl;cout << "局部静态内存区:" << &static_a << endl;cout << "局部静态内存区:" << &static_b << endl;cout << endl;cout << "new操作符开辟的内存区:" << &new_a << endl;cout << "new操作符开辟的内存区:" << &new_b << endl;cout << endl;return 0;}