返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++浅析内存分区模型概念与示例
  • 112
分享到

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

2024-04-02 19:04:59 112人浏览 安东尼
摘要

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

--结束END--

本文标题: C++浅析内存分区模型概念与示例

本文链接: https://lsjlt.com/news/167309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++浅析内存分区模型概念与示例
    目录初识C++内存分区模型程序运行前内存分区代码示例初识C++内存分区模型 在了解内存分区之前,我们先来聊一聊为什么要进行内存分区。在进行了内存分区之后,在不同的区域存放的数据,会有...
    99+
    2024-04-02
  • C++程序内存栈区与堆区模型案例分析
    目录栈区:栈区代码演示:堆区:堆区代码演示:new操作符:new操作符代码演示:栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死&rdqu...
    99+
    2024-04-02
  • C++内存模型与名称空间概念讲解
    目录1、存储持续性与作用域及链接性2、作用域和链接3、静态持续变量4、静态持续性和外部链接性5、静态持续性与内部链接性6、静态存储性与无链接性7、const8、函数和链接性9、语言的...
    99+
    2023-01-02
    C++内存模型 C++名称空间
  • C#泛型类概念举例分析
    这篇文章主要讲解了“C#泛型类概念举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型类概念举例分析”吧!C# 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列...
    99+
    2023-06-17
  • Java内存模型的示例分析
    这篇文章主要为大家展示了“Java内存模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java内存模型的示例分析”这篇文章吧。1. 为什么要有内存模型?要想回答这个问题,我们需要先弄...
    99+
    2023-06-29
  • jvm中java内存模型的示例分析
    这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存...
    99+
    2023-06-19
  • JVM系列之内存模型的示例分析
    这篇文章主要介绍JVM系列之内存模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 内存模型和运行时数据区这一章学习java虚拟机内存模型(Java Virtual machine menory mod...
    99+
    2023-06-15
  • JVM中内存区域与内存溢出的示例分析
    小编给大家分享一下JVM中内存区域与内存溢出的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java内存区域与内存溢出异常运行时数据区域程序计数器当前线程...
    99+
    2023-06-17
  • Java内存模型之重排序的示例分析
    小编给大家分享一下Java内存模型之重排序的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分...
    99+
    2023-06-15
  • JVM内存区域的示例分析
    这篇文章主要介绍了JVM内存区域的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JVM内存区域我们在编写程序时,经常会遇到OOM(out of Memory)以及内存...
    99+
    2023-06-05
  • C/C++中指针与内存管理的示例分析
    这篇文章主要介绍了C/C++中指针与内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又...
    99+
    2023-06-29
  • C/C++内存管理的示例分析
    这篇文章主要介绍了C/C++内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C/C++赋予程序员管理内存的自由,是C/C++语言特色,虽然这引入了复杂度和危险...
    99+
    2023-06-15
  • Java内存模型顺序一致性的示例分析
    小编给大家分享一下Java内存模型顺序一致性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和...
    99+
    2023-06-25
  • Golang内存模型实例源码分析
    这篇文章主要介绍“Golang内存模型实例源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存模型实例源码分析”文章能帮助大家解决问题。1. 简介(Introduction)Go ...
    99+
    2023-07-05
  • 掌握 C++ 递归的奥秘:概念与实例分析
    答案: c++++ 递归是一种函数调用自身的强大技巧。详细描述:递归函数将问题分解为更小的子问题。函数递归地调用自身来解决子问题,直至子问题足够小。常见的递归实战案例包括:阶乘计算、斐波...
    99+
    2024-05-01
    c++ 递归
  • Redis缓存IO模型的示例分析
    Redis缓存IO模型的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言redis作为应用最广泛的nosql数据库之一,大大小小也经历过很多次升级。在4.0版本之...
    99+
    2023-06-21
  • java内存模型讨论及案例分析
    常用内存选项 -Xmx: 最大堆大小 -Xms:最小堆大小 -Xss :线程堆栈大小,默认1M 生产环境最好保持 Xms = Xmx java内存研究 内存布局 可见: 堆大小 = 新生代 + 老年代,新生代=E+From Survivo...
    99+
    2023-08-30
    java 开发语言
  • C++中内存管理的示例分析
    这篇文章将为大家详细讲解有关C++中内存管理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述内存管理的原理庞大而复杂,然而这些都被操作系统进行了封装,并对外预留了API,这些api被c++调用...
    99+
    2023-06-25
  • Java开发中容器概念、分类与用法的示例分析
    这篇文章将为大家详细讲解有关Java开发中容器概念、分类与用法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、容器的概念在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,...
    99+
    2023-05-30
    java
  • JS中内存与变量存储的示例分析
    这篇文章将为大家详细讲解有关JS中内存与变量存储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JS神奇的Number案例一:金额的计算与传递18.9 * 100=1889.9...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作