【C++】内存分区模型

目录

1、缘起

2、内存分区模型

2.1、程序运行前

2.2、程序运行后 

3、总结 


1、缘起

        前几天学习完了 C++ 的 基础语法 知识点,现在终于要踏上学习 C++ 核心编程 的旅程了,期待沿途中所遇到的风景。

2、内存分区模型

C++ 程序在执行时,将内存大方向划分为 4 个区域

①  代码区:存放函数体的 二进制代码,由操作系统进行管理的

②  全局区:存放全局变量、静态变量、字符串常量和 const 修饰的全局变量(全局常量)

③  栈区:由编译器自动分配和释放,存放函数的参数值,局部变量和 const 修饰的局部变量(局部常量)等(编译器管理其生死)

  堆区由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收(程序员管理其生死)

内存四区的意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的编程灵活性。 

2.1、程序运行前

在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域

代码区:

        存放 CPU 执行的机器指令,

        代码区是 共享 的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可,

        代码区是 只读 的,使其只读的原因是防止程序意外地修改了它的指令。

全局区:

        全局变量和静态变量存放于此,

        全局区还包含了常量区,字符串常量和其他常量也存放于此,

        该区域的数据在程序结束后由操作系统释放。

2.2、程序运行后 

在程序运行后,又分出两个区域

栈区:

        由编译器自动分配和释放存放函数的参数值和局部变量等,

        注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

示例代码: 

#include<iostream>
using namespace std;

//栈区数据注意事项  --不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放

int* function(int b)  //形参数据也会放在栈区
{
	b = 100;
	int a = 10;  //局部变量  存放在栈区,栈区的数据在函数执行后自动释放
	return &a;  //返回局部变量的地址
}

int main()
{
	//接受 function 函数的返回值
	int* p = function(1);

	cout << *p << endl;  //第一次可以打印正确的数字,是因为编译器做了保留
	cout << endl;
	cout << *p << endl;  //第二次这个数据就不在保留了

	cout << endl;
	system("pause");
	return 0;
}

堆区: 

       堆区数据由程序员管理开辟和释放,

       堆区数据利用 new 关键字进行开辟内存。

示例代码:

#include<iostream>
using namespace std;

int* function()  
{
	//利用 new 关键字可以将数据开辟到堆区
	//指针本质也是局部变量,放在栈区,指针保存的数据是放在堆区
	int* p = new int(10);
	return p;
}

int main()
{
	//在堆区开辟数据
	int* p = function();

	cout << *p << endl;  
	cout << endl;
	cout << *p << endl;  

	cout << endl;
	system("pause");
	return 0;
}

3、总结 

        计算机程序的运行过程就像是一座 精密的工厂全局区 像是工厂的办公室,存放着程序的全局变量和静态变量,就像是管理层的决策和规划,确保整个工厂的顺利运行。代码区 则是工厂的生产线,存放着程序的指令,它们被一条条地执行,将原材料转化为成品。栈区 就像是工厂的临时存储区,存放着程序的局部变量和函数调用信息,它们的生命周期短暂,像是工人手中的工具,随时可以被使用和丢弃。堆区 则是工厂的仓库,存放着程序动态分配的内存,像是原材料的储存地,可以随时根据需要进行扩充或释放。这四个区域相互配合,构成了程序运行的基础,就像是工厂中各个部门的协同作战,共同打造出精美的产品。

        本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷,笔者必回,我们下期再见啦 !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aperion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值