内存分区模型
不同区域存放的数据,赋予不同的生命周期,可以进行更大的灵活编程
在程序编译后,生成exe可执行程序,为执行前分为代码区和全局区
1.代码区
-
存放函数体的二进制代码,由操作系统进行管理.
-
存放CPU执行的机器指令
-
代码区是共享的,为了方便对于频繁被执行的程序,只需要在内存中有一份代码即可
-
代码区是只读的,防止程序意外修改指令
2.全局区
- 存放全局变量、静态变量
- 全局区还包括常量区,字符串常量和其它常量
- 全局区数据在程序结束后由操作系统释放
- 常量区中存放const修饰的全局常量和字符串常量
#include <iostream>
using namespace std;
//全局变量
int global_a = 10;
int global_b = 10;
//const修饰的全局常量
const int c_g_a = 10;
int main() {
//全局区
//普通局部变量
int a = 10;
int b = 10;
//输出局部变量a、b的地址
/*这里报错Cast from pointer to smaller type 'int' loses information,
* 原因是在64位机器上int为4字节,指针全部为8字节,一般来说将int
改为uintptr_t即可.*/
cout << "局部变量a的地址为:" << (uintptr_t) &a << endl;
cout << "局部变量b的地址为:" << (uintptr_t) &b << endl;
//输出全局变量地址
cout << "全局变量global_a的地址为:" << (uintptr_t) &global_a << endl;
cout << "全局变量global_b的地址为:" << (uintptr_t) &global_b << endl;
//静态变量
static int s_a = 10;
static int s_b = 10;
cout << "静态变量s_a的地址为:" << (uintptr_t) &s_a << endl;
cout << "静态变量s_b的地址为:" << (uintptr_t) &s_b << endl;
//常量
//字符串常量
cout << "字符串常量的地址为:" << (uintptr_t) &"hello world!" << endl;
//const修饰的全局变量,const修饰的局部变量
cout << "const修饰全局常量c_g_a的地址为)" << (uintptr_t) &c_g_a << endl;
const int c_l_a = 10;
cout << "const修饰局部变量c_l_a的地址为" << (uintptr_t) &c_l_a << endl;
}
3.栈区
- 由编译器自动分配内存,存放函数的参数值,局部变量等
- 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
4.堆区
- 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
- 使用new在堆区开辟内存
int *func() {
int *p = new int(100);
return p;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
}
使用new关键字,可以将数据开辟到堆区,函数里的指针实质上还是局部变量,放在栈上,指针保存指向堆区数据的地址
标签:10,常量,int,分区,局部变量,内存,全局 From: https://www.cnblogs.com/HanXiaoCao/p/16717588.html