C++浅析内存分区模型概念与示例_第1页
C++浅析内存分区模型概念与示例_第2页
C++浅析内存分区模型概念与示例_第3页
C++浅析内存分区模型概念与示例_第4页
C++浅析内存分区模型概念与示例_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++浅析内存分区模型概念与示例目录初识C++内存分区模型程序运行前内存分区代码示例

初识C++内存分区模型

在了解内存分区之前,我们先来聊一聊为什么要进行内存分区。在进行了内存分区之后,在不同的区域存放的数据,会有不同的生命周期,从而会让程序员的编程变得更加灵活。

我们这次讨论的内存模型是将内存划分为四部分的版本,也是笔者在和黑马学习过程中学习到的版本。

而C++在程序运行的过程中,将内存分为四个区域:

存放函数的二进制代码,即CPU执行的机器指令,由操作系统进行管理。

存放全局变量、静态变量(static,分为全局与局部静态变量)和部分常量。

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

由程序员进行分配和释放,而如果程序员不释放,则在程序结束运行时,由操作系统来进行回收。

程序运行前

程序编译后,会生成可执行程序,而在该程序未执行之前,内存分为代码区和全局区两个区域。

代码区

存放函数的二进制代码,即CPU执行的机器指令,由操作系统进行管理。

代码区的特性是共享与只读:

共享:对于被频繁执行的程序,在内存中只需要保存一份代码即可。只读:防止程序被意外修改。

全局区

存放全局变量、静态变量(static)和部分常量。

其中部分常量为常量区,即字符串常量和全局常量(const关键字修饰的全局常量);不包括局部常量。

栈区

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

堆区

由程序员进行分配和释放,而如果程序员不释放,则在程序结束运行时,由操作系统来进行回收。

主要利用new在堆区开辟内存,由delete进行释放。

ps:利用new常见的数据,返回的是该数据对应类型的指针。

内存分区代码示例

#includeiostream

usingnamespacestd;

//全局变量全局区

intglobal_a=10;

intglobal_b=20;

//全局常量全局区

constintglobal_const_a=10;

constintglobal_const_b=20;

//全局静态变量全局区

staticintstatic_global_a=10;

staticintstatic_global_b=20;

//形参栈区

voidfunc(inta){

//局部变量栈区

intb=20;

cout"函数func()的形参a的地址为:"aendl;

cout"函数func()的局部变量b的地址为:"bendlendl;

intmain(){

cout"栈区"endl;

//局部变量栈区

inta=10;

intb=20;

cout"局部变量a的地址为:"aendl;

cout"局部变量b的地址为:"bendl;

//局部常量栈区

constintconst_a=10;

constintconst_b=10;

cout"局部常量const_a的地址为:"const_aendl;

cout"局部常量const_b的地址为:"const_bendl;

//形参栈区

func(a);

cout"全局区"endl;

cout"全局变量global_a的地址为:"global_aendl;

cout"全局变量global_b的地址为:"global_bendl;

cout"全局常量global_const_a的地址为:"global_const_aendl;

cout"全局常量global_const_a的地址为:"global_const_bendl;

cout"全局静态变量static_global_a的地址为:"static_global_aendl;

cout"全局静态变量static_global_b的地址为:"static_global_bendl;

//局部静态变量全局区

staticintStatic_a=10;

staticintStatic_b=20;

cout"局部静态变量Static_a的地址为:"Static_aendl;

cout"局部静态变量Static_b的地址为:"Static_bendl;

//字符串常量全局区

cout"字符串常量的地址为:""helloworlds1"endl;

cout"字符串常量的地址为:""helloworlds2"endlendl;

cout"堆区"endl;

//new堆区

int*new_a=newint(10);

int*new_b=newint(2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论