我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

初识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++内存分区模型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++内存模型与名称空间概念讲解

这篇文章主要介绍了C++内存模型与名称空间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-02

Java内存模型的示例分析

这篇文章主要为大家展示了“Java内存模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java内存模型的示例分析”这篇文章吧。1. 为什么要有内存模型?要想回答这个问题,我们需要先弄
2023-06-29

jvm中java内存模型的示例分析

这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存结构记得是
2023-06-19

JVM系列之内存模型的示例分析

这篇文章主要介绍JVM系列之内存模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 内存模型和运行时数据区这一章学习java虚拟机内存模型(Java Virtual machine menory mod
2023-06-15

JVM中内存区域与内存溢出的示例分析

小编给大家分享一下JVM中内存区域与内存溢出的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java内存区域与内存溢出异常运行时数据区域程序计数器当前线程
2023-06-17

Java内存模型之重排序的示例分析

小编给大家分享一下Java内存模型之重排序的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分
2023-06-15

C/C++中指针与内存管理的示例分析

这篇文章主要介绍了C/C++中指针与内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又
2023-06-29

Java内存模型顺序一致性的示例分析

小编给大家分享一下Java内存模型顺序一致性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和
2023-06-25

Java并发编程之volatile与JMM多线程内存模型实例分析

本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录