c++ 内存四大区介绍

内存四大区介绍目录


前言

这篇文章主要讲解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运算符开辟内存存入堆里面,这样就可以一直使用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值