程序的内存模型
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)问题