C++内存分区模型
创始人
2024-02-27 21:46:05

参考至: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);

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

相关内容

热门资讯

投资者提问:请问董秘,当前中日... 投资者提问:请问董秘,当前中日关系陷入僵局乃至谷底之际,公司有规划更多使用国产光刻胶等材料来替代日系...
富德生命人寿咸阳中心支公司被罚... 12月16日金融一线消息,据咸阳金融监管分局行政处罚信息公开表显示,富德生命人寿保险股份有限公司咸阳...
市场监管总局:抓紧推进出台《互... 转自:北京日报客户端记者16日从市场监管总局获悉,市场监管总局正抓紧推进《互联网平台反垄断合规指引》...
天奇股份:锂电循环业务夯实产业... 12月16日,江西天奇金泰阁集团(简称“天奇金泰阁”)资本赋能发展大会在江西龙南举行。会上,天奇股份...
「侠客岛」他们用上了“AI分身...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:海外网)来源...