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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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++程序的内存分区有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

    免责声明:

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

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

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

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

    下载Word文档

    猜你喜欢

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

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

    c++32位程序和64位程序的区别有哪些

    这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和64位程序的区别有哪些”吧!代码上的区别实际上,对于32位程序和6
    2023-06-16

    Java中的内存分布有哪些

    今天就跟大家聊聊有关Java中的内存分布有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java内存分布:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不
    2023-05-31

    golang内存分配的方法有哪些

    在Go语言中,内存分配的方法主要有以下几种:堆分配:当使用`new`关键字或`make`函数创建对象时,Go语言会在堆上分配内存。堆是一个动态的内存区域,用于存储不同大小的对象。在堆上分配内存会涉及到垃圾回收机制的管理。栈分配:对于一些较小
    2023-10-27

    C++应用程序存在的重要元素有哪些

    这篇文章主要讲解了“C++应用程序存在的重要元素有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++应用程序存在的重要元素有哪些”吧!在C++应用程序里不同类型数据进行混合运算时,C+
    2023-06-17

    jvm内存分配的方式有哪些

    JVM内存分配的方式有以下几种:堆(Heap):用于存储对象实例,是JVM中最大的一块内存区域。堆内存的分配和回收是由垃圾收集器(Garbage Collector)负责的,当对象不再被引用时,垃圾收集器会自动回收该对象所占用的内存。栈(S
    2023-10-27

    C++内存管理的知识点有哪些

    这篇文章主要讲解了“C++内存管理的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++内存管理的知识点有哪些”吧!1. 简述下C++的内存分配方式。在C++中,内存可以分为 5
    2023-07-05

    小程序的分类有哪些

    这篇文章主要介绍“小程序的分类有哪些”,在日常操作中,相信很多人在小程序的分类有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序的分类有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1.电商小
    2023-06-27

    java内存分配策略有哪些

    Java内存分配策略主要有以下几种:静态分配:即在程序编译时,分配一块固定大小的内存空间给变量或对象,这块内存空间在整个程序的生命周期中都不会释放。静态分配适用于全局变量、静态变量等需要一直存在的数据。栈上分配:栈上分配是指将方法中的局部变
    java内存分配策略有哪些
    2024-02-29

    CentOS下SWAP分区建立及释放内存的方法有哪些

    本篇内容介绍了“CentOS下SWAP分区建立及释放内存的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一:一、查看系统当前的
    2023-06-10

    影响C++/C程序的要素有哪些

    本篇内容主要讲解“影响C++/C程序的要素有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“影响C++/C程序的要素有哪些”吧!C++/C程序对函数的处理方式是不同的。extern “C”是使
    2023-06-17

    .NET内存分配的知识点有哪些

    这篇文章主要讲解了“.NET内存分配的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET内存分配的知识点有哪些”吧!在分析内存分配时,应该先了解关于堆栈的区别堆的分配向高地址
    2023-06-17

    电脑内存DDR4和DDR3有哪些区别

    这篇文章主要讲解了“电脑内存DDR4和DDR3有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑内存DDR4和DDR3有哪些区别”吧!内存是什么?内存是电脑中重要的核心部件之一,内
    2023-06-28

    编程热搜

    • 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动态编译

    目录