程序的内存模型

古人已用三冬足,年少今开万卷余。这篇文章主要讲述程序的内存模型相关的知识,希望能为你提供帮助。
1.代码区:存放函数体的二进制代码,由操作系统进行管理的。存放CPU执行的机器指令。
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份这个代码就行。
代码区是只可读的。
2.全局区:存放全局变量和静态变量以及常量。包含:静态变量(static修饰的变量),常量(字符串常量,const修饰的全局变量(也就是全局常量))。


//全局变量
int a;
int main()
//static关键词
static int a;
//字符串常量
"hello world"
//const修饰全局变量
const int a;
int main()

顺便提一下局部变量
//就是const修饰的局部变量或者函数体内的变量
int main(){
int a;
return 0;
}



总结:也就是说,C++在程序运行前分为代码区和全局区;
代码区特点是共享和可读;
全局区存放全局变量,静态变量,常量;
常量中存放const修饰的全局常量和字符串常量;
3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。【程序的内存模型】注意:不要返回局部变量的地址,比如:


int*fun()
{
int a=10;
return & a;
}
int main(){
int *p=fun();
cout< < "*p="< < *p< < endl;
cout< < "*p="< < *p< < endl;
return 0;
}

结果:

第一次能输出10是因为编译器给我们进行了保留,但是保留只有一次,第二次就是乱码了。
然后就是形参数据也是存放在栈区的。
4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统进行回收。在C++中主要由new在堆区开辟内存


void fun()
{
int *p=new int(10); //利用new关键词,返回int*的指针,用p来接受。
}
int main(){
int *p=fun();
cout< < *p< < endl; //结果的就是10
return 0;
}

总结:new关键词不是直接给你数据,而是返回一个相应类型的指针。
顺便提下释放的操作:
用delete关键词
int *fun()
{
int *p=new int(10); //在堆区创建数据
return p;
}

void fun1(){
int *arr=new int[10]; //返回int(*)[]的数组指针
for(int i=0; i< 10; i++)//给创建在堆区的数据进行赋值
arr[i]=i+100;
for(int i=0; i< 10; i++)//打印数组
cout< < arr[i]< < endl;
delete []arr; //释放堆区数组,要加[]才可以
}

int main(){
int *p=fun();
cout< < *p< < endl;
delete p;
cout< < *p< < endl;
return 0;
}





如有不对,欢迎指正。

    推荐阅读