C++浅析内存分区模型概念与示例

 更新时间:2022年09月10日 10:50:20   作者:玲珑楼主安  
在了解内存分区之前,我们先来聊一聊为什么要进行内存分区。在进行了内存分区之后,在不同的区域存放的数据,会有不同的生命周期,从而会让程序员的编程变得更加灵活
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

初识C++内存分区模型

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

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

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

  • 代码区

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

  • 全局区

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

  • 栈区

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

  • 堆区

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

程序运行前

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

代码区

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

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

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

全局区

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

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

#程序运行后

栈区

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

堆区

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

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

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

内存分区代码示例

#include <iostream>
using namespace std;
//全局变量 全局区
int global_a=10;
int global_b=20;
//全局常量 全局区
const int global_const_a=10;
const int global_const_b=20;
//全局静态变量 全局区
static int static_global_a=10;
static int static_global_b=20;
//形参 栈区
void func(int a){
    //局部变量 栈区
    int b=20;
    cout<<"函数func()的形参 a 的地址为:"<< &a <<endl;
    cout<<"函数func()的局部变量 b 的地址为:"<< &b <<endl<<endl;
}
int main() {
    cout<<"栈区"<<endl;
    //局部变量 栈区
    int a = 10;
    int b = 20;
    cout<<"局部变量 a 的地址为:"<< &a <<endl;
    cout<<"局部变量 b 的地址为:"<< &b <<endl;
    //局部常量 栈区
    const int const_a=10;
    const int const_b=10;
    cout<<"局部常量 const_a 的地址为:"<< &const_a <<endl;
    cout<<"局部常量 const_b 的地址为:"<< &const_b <<endl;
    //形参 栈区
    func(a);
    cout<<"全局区"<<endl;
    cout<<"全局变量 global_a 的地址为:"<< &global_a <<endl;
    cout<<"全局变量 global_b 的地址为:"<< &global_b <<endl;
    cout<<"全局常量 global_const_a 的地址为:"<< &global_const_a <<endl;
    cout<<"全局常量 global_const_a 的地址为:"<< &global_const_b <<endl;
    cout<<"全局静态变量 static_global_a 的地址为:"<< &static_global_a <<endl;
    cout<<"全局静态变量 static_global_b 的地址为:"<< &static_global_b <<endl;
    //局部静态变量 全局区
    static int Static_a=10;
    static int Static_b=20;
    cout<<"局部静态变量 Static_a 的地址为:"<< &Static_a <<endl;
    cout<<"局部静态变量 Static_b 的地址为:"<< &Static_b <<endl;
    //字符串常量 全局区
    cout<<"字符串常量的地址为:"<< &"hello world s1" <<endl;
    cout<<"字符串常量的地址为:"<< &"hello world s2" <<endl<<endl;
    cout<<"堆区"<<endl;
    //new 堆区
    int* new_a=new int(10);
    int* new_b=new int(20);
    cout<<"堆区变量 new_a 的地址为:"<< new_a <<endl;
    cout<<"堆区变量 new_a 的地址为:"<< new_b <<endl<<endl;
    return 0;
}

运行结果分析如下:

到此这篇关于C++浅析内存分区模型概念与示例的文章就介绍到这了,更多相关C++内存分区模型内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • C语言中常见的六种动态内存错误总结

    C语言中常见的六种动态内存错误总结

    学习过C语言中的动态内存函数,例如【malloc】、【calloc】、【realloc】、【free】,那它们在使用的过程中会碰到哪些问题呢,本本文我们一起来探讨下,感兴趣的朋友跟着小编一起来看看吧
    2023-11-11
  • C语言实现排序算法之归并排序详解

    C语言实现排序算法之归并排序详解

    这篇文章主要介绍了C语言实现排序算法之归并排序,对归并排序的原理及实现过程做了非常详细的解读,需要的朋友可以参考下
    2014-07-07
  • Visual Studio 如何创建C/C++项目问题

    Visual Studio 如何创建C/C++项目问题

    这篇文章主要介绍了Visual Studio 如何创建C/C++项目问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++实现考勤管理系统

    C++实现考勤管理系统

    这篇文章主要介绍了C++实现考勤管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言快速排序与二分查找算法示例

    C语言快速排序与二分查找算法示例

    这篇文章主要介绍了C语言快速排序与二分查找算法,涉及C语言随机数生成、快速排序及二分查找等算法相关实现技巧,需要的朋友可以参考下
    2018-01-01
  • C++ GDI实现图片格式转换

    C++ GDI实现图片格式转换

    GDI+(Graphics Device Interface Plus)是一种用于图形绘制和图像处理的应用程序编程接口(API),在Windows平台上广泛使用,本文就来介绍一下如何使用GDI实现图片格式转换吧
    2023-12-12
  • C++实现有向图邻接表的构建

    C++实现有向图邻接表的构建

    这篇文章主要为大家详细介绍了C++实现有向图邻接表的构建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C/C++调用Fortran的DLL的操作过程

    C/C++调用Fortran的DLL的操作过程

    这篇文章主要介绍了C/C++调用Fortran的DLL,本文以一个简单的加法器为例,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 使用C语言编写钢琴小程序

    使用C语言编写钢琴小程序

    这篇文章主要为大家详细介绍了使用C语言编写钢琴小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C++ OpenCV实战之网孔检测的实现

    C++ OpenCV实战之网孔检测的实现

    这篇文章主要介绍了如何利用C++和OpenCV实现网孔检测,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,感兴趣的小伙伴可以了解一下
    2022-05-05

最新评论

?


http://www.vxiaotou.com