程序的内存模型

Posted 别跑昂,你

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序的内存模型相关的知识,希望对你有一定的参考价值。

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;
}



如有不对,欢迎指正。

以上是关于程序的内存模型的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

python常用代码

C 中的共享内存代码片段

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)

程序的内存模型

内存模型