返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++程序的内存分区有哪些
  • 880
分享到

C++程序的内存分区有哪些

2023-06-25 11:06:03 880人浏览 安东尼
摘要

小编给大家分享一下c++程序的内存分区有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++程序在运行时所占用的内存区域,一般可分为栈内存区、堆内存区、全局/

小编给大家分享一下c++程序的内存分区有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    C++程序在运行时所占用的内存区域,一般可分为栈内存区、堆内存区、全局/静态内存区、文字常量内存区及程序代码区5大分区:

    C++程序的内存分区有哪些

    下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。

    1、栈内存区

    栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区。栈分区是用来存放函数参数及函数局部变量值的内存区,是由编译器在编译时自动分配和释放的。

    函数中的参数与函数中的局部变量占用的内存是代码执行到函数(进入函数)是分配的,在离开时函数时这些内存会自动被释放。下面从下面几个简单的实例来更进一步地认识栈内存。

    1.1、调用函数时通过栈来传递函数的参数值       

    调用函数时时通过栈传递参数值的,即在调用函数之前要将函数的参数值依次压入到栈上,然后再去call被调用函数的。这点从汇编代码上可以清晰地看出来。比如下面一段简单的实现两数相加的代码:

    // 被调用函数int AddNum(int a, int b){    int nSum = a + b;    return nSum;}  // 调用内调用函数的实例代码int a = 7;int b = 8; int  nSum = AddNum(a, b);

    可以在VS中查看上述C++代码对应的汇编代码。具体的做法是,将上述代码拷贝到VS中,启动VS调试,在鼠标右键单击显示的右键菜单中点击“转到反汇编”区查看C++代码对应的汇编代码:

    C++程序的内存分区有哪些

    从上述汇编代码可以看出,在调用AddNum函数之前,将要传入的参数a和参数b的值先压到栈上,然后再去call AddNum函数。作为被调函数的AddNum会从栈上读取传入的参数内容。

    1.2、线程占用的栈内存是有上限的

    线程占用的栈内存是有上限的,可以在创建线程时指定栈空间的大小。在windows上,线程默认的栈空间是1MB。线程在某一时刻的函数调用堆栈中的所有函数占用的栈空间总和,就是当前时刻的线程占用的栈内存。

    进入函数时会将该函数的栈空间累计到所在线程的栈空间占用内存数上(函数内部申请存放局部变量的栈空间),离开函数则会释放它占用的栈空间,就会将所在线程占用的栈内存数上减掉函该函数占用的空间。如果当前线程占用的栈空间大于线程的上限时(一般是在进入一个函数时触发),则会报出“stack overflow”的栈溢出异常:

    C++程序的内存分区有哪些

    程序会发生崩溃。

    这里有一点需要说明一下,在某个函数中使用了switch...case语句,语句中包含了多个case分支,在这些分支中定义了一些局部变量,虽然这些局部变量的生命周期只位于case子句中,但是都是直接算在所在函数的栈空间上的,是刚执行进函数就分配好了,即便当前还没运行到对应的case子句中,即便这些case子句的局部变量的生命周期仅在case子句内!

    2、堆内存区

    堆内存也是我们最常用的内存区,因为每个线程的栈内存是有限的,我们一般将大部分数据要放置在堆内存中。

    在C++中,malloc/new申请的内存都是从堆内存上分配的,用完后由free/delete区释放的。如果没有释放堆内存,则程序结束时由操作系统统一回收。

    堆内存的管理比栈内存要复杂的多,如果是堆内存异常导致的崩溃,比栈内存异常(比如内存越界引起内存访问为例)导致的崩溃,要难查的多。

    如果malloc/new来的内存在用完后没有释放,则会导致内存泄露,如果频繁执行的代码中有内存泄露则是致命的,因为随着程序的运行时间的加长,会产生越来越多的内存泄露,如果将所属进程虚拟内存耗尽,会产生“Out of memory”的异常:

    C++程序的内存分区有哪些

     程序直接闪退崩溃。

    3、全局/静态内存区

    全局变量和静态变量的内存就是在该区上分配的,全局变量和静态变量的生命周期也是一样的,都是在程序启动时分配内存的,在程序退出时释放内存的。

    全局变量一般会使用extern关键字来声明,比如:

    extern int m_nClientId;

    而静态变量则是使用static关键字来声明:

    static int nCount;

    全局变量和静态变量都要求在定义的时候要初始化,注意此处讲的定义是和声明是相对应的概念。全局变量和静态变量的区别在于,全局变量的作用域更广,整个模块中都能使用。静态变量则因其定义的位置不同有不同的作用域。

    可以在函数中定义静态变量,也可以在类中定义静态成员变量。函数中定义的静态变量只能在函数中被访问,类中定义的静态变量则可以在类外部使用“类名::静态成员变量名”去访问。

    4、文字常量区

    该分区是用来存放常量值,如常量字符串等,比如如下的字符串常量:(将字符串常量的地址赋值给指针p):

    char* p = ”this is a test.”;

    该字符串占用的内存地址就是文字常量区内存上的。

     该部分内存中的内容是固定的常量,是不允许修改的,程序结束后由操作系统统一回收。这部分内容比较简单,没什么要讲的。

    5、程序代码区

    前面说的内存都是数据段的内存,是用来存放程序运行中的各种数据的;该部分的内存是代码段的内存,是用来存放程序二进制代码的。

    数据段的内存地址和代码段指令的地址,完全是两个概念,不能混为一谈。比如某个变量的内存地址是数据段的地址:

    C++程序的内存分区有哪些

    某条汇编指令的地址,则是代码段的地址:

    C++程序的内存分区有哪些

    是两个完全不搭嘎的地址,一定要区分开来。

    以上是“C++程序的内存分区有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

    --结束END--

    本文标题: C++程序的内存分区有哪些

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

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

    猜你喜欢
    • C++程序的内存分区有哪些
      小编给大家分享一下C++程序的内存分区有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++程序在运行时所占用的内存区域,一般可分为栈内存区、堆内存区、全局/...
      99+
      2023-06-25
    • C++程序的五大内存分区实例详解
      目录1、栈内存区1.1、调用函数时通过栈来传递函数的参数值       1.2、线程占用的栈内存是有上限的2、堆内存区3、全局/静态内存区4、...
      99+
      2024-04-02
    • C++程序内存栈区与堆区模型案例分析
      目录栈区:栈区代码演示:堆区:堆区代码演示:new操作符:new操作符代码演示:栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死&rdqu...
      99+
      2024-04-02
    • c++32位程序和64位程序的区别有哪些
      这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和64位程序的区别有哪些”吧!代码上的区别实际上,对于32位程序和6...
      99+
      2023-06-16
    • C++ 面向对象程序设计--内存分区详解
      目录一、分区的意义二、代码区1、定义2、特点三、全局区1、定义2、特点3、相关代码1)全局变量2)静态变量四、栈区——程序运行后1、定义2、相关代码五、堆区——运行后1、定义2、相关...
      99+
      2024-04-02
    • Java中的内存分布有哪些
      今天就跟大家聊聊有关Java中的内存分布有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java内存分布:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不...
      99+
      2023-05-31
      java 内存分布 ava
    • jvm内存分配的方式有哪些
      JVM内存分配的方式有以下几种: 堆(Heap):用于存储对象实例,是JVM中最大的一块内存区域。堆内存的分配和回收是由垃圾收集...
      99+
      2023-10-27
      jvm
    • golang内存分配的方法有哪些
      在Go语言中,内存分配的方法主要有以下几种: 堆分配:当使用`new`关键字或`make`函数创建对象时,Go语言会在堆上分配内...
      99+
      2023-10-27
      golang
    • C程序中Ubuntu、stm32的内存分配问题
      目录一、内存分区概念介绍1.1、C/C++编译程序的内存占用1.2、栈和堆、全局/静态存储区和常量存储区的对比1.3、图片说明 二、C语言编程论证1.1、Ubuntu测试代码实现 1...
      99+
      2024-04-02
    • 小程序BackgroundAudioManager的误区有哪些
      这篇文章主要为大家展示了“小程序BackgroundAudioManager的误区有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序Background...
      99+
      2024-04-02
    • C++应用程序存在的重要元素有哪些
      这篇文章主要讲解了“C++应用程序存在的重要元素有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++应用程序存在的重要元素有哪些”吧!在C++应用程序里不同类型数据进行混合运算时,C+...
      99+
      2023-06-17
    • C++核心编程之内存分区详解
      目录1、内存分区模型:2、代码区:3、全局区:4、小结:5、代码演示:6、运行结果:总结1、内存分区模型: C++程序在执行时,将内存大方向划分成4个区域 (1)代码区:存放安徽念书...
      99+
      2024-04-02
    • C++内存管理的知识点有哪些
      这篇文章主要讲解了“C++内存管理的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++内存管理的知识点有哪些”吧!1. 简述下C++的内存分配方式。在C++中,内存可以分为 5...
      99+
      2023-07-05
    • 小程序的分类有哪些
      这篇文章主要介绍“小程序的分类有哪些”,在日常操作中,相信很多人在小程序的分类有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序的分类有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1.电商小...
      99+
      2023-06-27
    • java内存分配策略有哪些
      Java内存分配策略主要有以下几种: 静态分配:即在程序编译时,分配一块固定大小的内存空间给变量或对象,这块内存空间在整个程序的...
      99+
      2024-02-29
      java
    • CentOS下SWAP分区建立及释放内存的方法有哪些
      本篇内容介绍了“CentOS下SWAP分区建立及释放内存的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一:一、查看系统当前的...
      99+
      2023-06-10
    • .NET内存分配的知识点有哪些
      这篇文章主要讲解了“.NET内存分配的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET内存分配的知识点有哪些”吧!在分析内存分配时,应该先了解关于堆栈的区别堆的分配向高地址...
      99+
      2023-06-17
    • 影响C++/C程序的要素有哪些
      本篇内容主要讲解“影响C++/C程序的要素有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“影响C++/C程序的要素有哪些”吧!C++/C程序对函数的处理方式是不同的。extern “C”是使...
      99+
      2023-06-17
    • 电脑内存DDR4和DDR3有哪些区别
      这篇文章主要讲解了“电脑内存DDR4和DDR3有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑内存DDR4和DDR3有哪些区别”吧!内存是什么?内存是电脑中重要的核心部件之一,内...
      99+
      2023-06-28
    • vue跟小程序的区别有哪些
      这篇“vue跟小程序的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue跟小程...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作