C++内存分区模型

参考至:C + + memory partition model (programs.team)

一、内存分区简介

1.1 内存分区

在执行c++程序的过程中,内存会被大致分为四块区域:

1> 代码区域:存储二进制代码,由操作系统管理。

2> 全局区域:存储全局变量、静态变量、常量。

3> 栈区域:存储局部变量、参数值等。由编译器自动分配和释放。

4> 堆区域:该区域由程序员开辟和释放。如果程序员未释放相应的内存,在程序结束的时候操作系统会将其回收释放。

1.2 内存分区的意义

 数据存储在不同的区域拥有不同的生命周期,使我们的程序灵活易用。

二、程序运行各阶段的内存分配

2.1 程序运行前

 在程序编译完成后,会生成一个可执行文件。在程序执行之前,主要分为两块区域:

1> 代码区域:存储由CPU执行的机器指令。

代码区域是共享的、只读的。共享的目的是为了在频繁执行程序的时候只有一份代码在内存中;只读的目的是为了防止程序意外的修改其机器指令。

2> 全局区域:全局和静态变量存储在此区域。

该区域还包含了存储着字符串常量和其他常量的常量区域

该区数据会在程序结束时被操作系统释放。

2.2 程序运行期间

 程序运行期间,主要是栈区和堆区在不断的开辟和释放:

1> 栈区域:编译器分配和释放用来存储函数内的局部变量和函数参数。

切记不可返回函数内的栈区局部变量地址到函数外,因为该区的生命周期是不可控的、短暂的,会出现非法操作。

2> 堆区域:程序员手动开辟和释放,如果程序员不对其进行释放,程序结束后,操作系统会对其释放。

在堆区开辟内存使用运算符:new

在堆区释放内存使用运算符:delete

一直不释放堆区无效内存,会导致堆区内存不断增大、内存碎片化、内存泄漏,影响效率。

2.3 程序运行结束后

操作系统会释放未释放的内存。

三、关于变量的一些知识

/*
 * @brief 有以下程序,用以说明变量的一些知识
 */

/*
 *@brief 定义 向程序表明变量的类型和名字并分配地址
 * 或者向程序表明函数的名字、参数、返回值以及具体实现
 * 只要分配了地址,就是定义!
 * 定义只可发生一次,即相同类型、名字的变量只可定义一次
 */

//定义,定义一个全局变量,类型为int,并且将其初始化为10,存储在全局区域
int num = 10;

//定义,定义一个函数,参数有一个,类型为int,该参数会开辟在栈区域;返回值为bool类型
bool Func(int a)
{
    //定义,定义一个局部变量,类型为int,会开辟在栈区域
    int num;
    return true;
}

//定义,定义一个静态变量,类型为double,存储在全局区域(静态区)
static double num2;

/*
 *@brief 声明 向程序表明变量的类型和名字或者向程序表面函数的名字、参数、返回值
 */

//声明,不是定义,声明了在其他文件定义了全局变量num,在此文件可以直接使用
extern int num;

//声明,不是定义,声明了在其他文件定义了全局函数max,在此文件可以直接使用
extern double max(double d1,double d2);

以上整理,可能存疑有错,仅用于个人知识总结,请谨慎参考。如有错误,欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冯耀文

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

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

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

打赏作者

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

抵扣说明:

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

余额充值