内存四大区介绍目录
文章目录
前言
这篇文章主要讲解c++内存四大区的一些概念和个人见解。
将内存四大区想象成在内存条上分为四个板块并在程序编码上的相对应,本文会讲解每个板块在程序编译上的位置以及如何划分的内存区域。
本文主要参考黑马程序员c++内存视频内容
一、内存四大区介绍
1.1内存分为哪四大区
1.全局区:包含全局变量、静态变量以及常量
2.代码区:存放二进制代码,是由操作系统所管理的。
3.栈区:由编译器自动分配释放,存放函数的参考值,局部变量等。
4.堆区:由程序员分配和释放若程序员不释放,程序结束后再由操作系统回收。
1.2内存划分四区的意义
不同的内存区域存放不同的数据,主要是赋予不同的代码运行时所生效的周期给我们带来更大的编程灵活性。
这句话主要是解释代码区与堆区的划分:
代码区的数据“生死”是由操作系统决定的,是我们没有办法控制的,这点也是它的只读性特点,所谓只读性就是防止程序意外或者是恶意被他人修改了它的指令所带来的效果。
而堆区是在操作程序运行后所产生的的划分区,是我们可以人为进行分配和释放的。
二、内存四大区介绍
1.局部变量、全局变量、静态变量、常量的区别(全局区)
(1)局部变量的地址
由代码可见,局部变量的地址是74开头的
值得注意的一点是在vs编译器下代码中的(int)&a是可行的,而在devc编译器下则会报错,需要改成long long。
(2)全局变量的地址
而全局变量则是46开头的,由此可见全局变量与局部变量的内存空间是分开存储的。
(3)静态变量的地址
静态变量也是46开头,所以它与全局变量是存放在一个内存空间区里的
(4)常量
常量的类型众多,大家只要记住除了const修饰的局部常量以及局部常量是在局部变量区的,其他常量都在全局区中。
2.代码区
(1)概念
存放CPU执行的机器指令 代码是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中存储一份代码即可。
代码是只读的,使其只读的原因是防止程序意外地修改了它的指令。
3.栈区
(1)概念
由编译器自动分配释放,存放函数的参考值,局部变量等。
栈区是在程序运行之后产生的区域,
(2)栈的演示代码
int *func()
{
int a=10;
return &a;
}
int main()
{
int *p=func();
cout<<*p<<endl;//第一次正常
cout<<*p<<endl;//第二次异常原因是系统已经释放掉了
return 0;
}
运行结果发现第一次数据没有问题,第二次数据出现问题,因为系统把指针所指向的数据自动释放掉了。
那如果我们用这个数据一直到程序结束怎么办?堆区的作用就来了。
4.堆区
(1)概念
堆区由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
(2)解释
堆区数据有我们程序员来决定“生死”,倘若我们不手动释放掉,则数据会在程序结束再被释放。
(3)堆的代码演示代码
int* fun()//定义一个整型指针函数
{
int *a = new int(10);
return a;
}
int main()
{
int *p;
p = fun();
cout<<*p<<endl;
cout<<*p<<endl;
return 0;
}
我们通过new运算符开辟内存存入堆里面,这样就可以一直使用了。