C++内存分区模型
玲珑楼主安 人气:0初识C++内存分区模型
在了解内存分区之前,我们先来聊一聊为什么要进行内存分区。在进行了内存分区之后,在不同的区域存放的数据,会有不同的生命周期,从而会让程序员的编程变得更加灵活。
我们这次讨论的内存模型是将内存划分为四部分的版本,也是笔者在和黑马学习过程中学习到的版本。
而C++在程序运行的过程中,将内存分为四个区域:
- 代码区
存放函数的二进制代码,即CPU执行的机器指令,由操作系统进行管理。
- 全局区
存放全局变量、静态变量(static,分为全局与局部静态变量)和部分常量。
- 栈区
由编译器自动分配和释放,存放函数的参数值、局部变量、局部常量等。
- 堆区
由程序员进行分配和释放,而如果程序员不释放,则在程序结束运行时,由操作系统来进行回收。
程序运行前
程序编译后,会生成可执行程序,而在该程序未执行之前,内存分为代码区和全局区两个区域。
代码区
存放函数的二进制代码,即CPU执行的机器指令,由操作系统进行管理。
代码区的特性是共享与只读:
- 共享:对于被频繁执行的程序,在内存中只需要保存一份代码即可。
- 只读:防止程序被意外修改。
全局区
存放全局变量、静态变量(static)和部分常量。
其中部分常量为常量区,即字符串常量和全局常量( const 关键字修饰的全局常量);不包括局部常量。
#程序运行后
栈区
由编译器自动分配和释放,存放函数的参数值、局部变量、局部常量等。
堆区
由程序员进行分配和释放,而如果程序员不释放,则在程序结束运行时,由操作系统来进行回收。
主要利用 new 在堆区开辟内存,由 delete 进行释放。
ps:利用 new 常见的数据,返回的是该数据对应类型的指针。
内存分区代码示例
#include <iostream> using namespace std; //全局变量 全局区 int global_a=10; int global_b=20; //全局常量 全局区 const int global_const_a=10; const int global_const_b=20; //全局静态变量 全局区 static int static_global_a=10; static int static_global_b=20; //形参 栈区 void func(int a){ //局部变量 栈区 int b=20; cout<<"函数func()的形参 a 的地址为:"<< &a <<endl; cout<<"函数func()的局部变量 b 的地址为:"<< &b <<endl<<endl; } int main() { cout<<"栈区"<<endl; //局部变量 栈区 int a = 10; int b = 20; cout<<"局部变量 a 的地址为:"<< &a <<endl; cout<<"局部变量 b 的地址为:"<< &b <<endl; //局部常量 栈区 const int const_a=10; const int const_b=10; cout<<"局部常量 const_a 的地址为:"<< &const_a <<endl; cout<<"局部常量 const_b 的地址为:"<< &const_b <<endl; //形参 栈区 func(a); cout<<"全局区"<<endl; cout<<"全局变量 global_a 的地址为:"<< &global_a <<endl; cout<<"全局变量 global_b 的地址为:"<< &global_b <<endl; cout<<"全局常量 global_const_a 的地址为:"<< &global_const_a <<endl; cout<<"全局常量 global_const_a 的地址为:"<< &global_const_b <<endl; cout<<"全局静态变量 static_global_a 的地址为:"<< &static_global_a <<endl; cout<<"全局静态变量 static_global_b 的地址为:"<< &static_global_b <<endl; //局部静态变量 全局区 static int Static_a=10; static int Static_b=20; cout<<"局部静态变量 Static_a 的地址为:"<< &Static_a <<endl; cout<<"局部静态变量 Static_b 的地址为:"<< &Static_b <<endl; //字符串常量 全局区 cout<<"字符串常量的地址为:"<< &"hello world s1" <<endl; cout<<"字符串常量的地址为:"<< &"hello world s2" <<endl<<endl; cout<<"堆区"<<endl; //new 堆区 int* new_a=new int(10); int* new_b=new int(20); cout<<"堆区变量 new_a 的地址为:"<< new_a <<endl; cout<<"堆区变量 new_a 的地址为:"<< new_b <<endl<<endl; return 0; }
运行结果分析如下:
加载全部内容