iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++程序的五大内存分区实例详解
  • 277
分享到

C++程序的五大内存分区实例详解

2024-04-02 19:04:59 277人浏览 独家记忆
摘要

目录1、栈内存区1.1、调用函数时通过栈来传递函数的参数值       1.2、线程占用的栈内存是有上限的2、堆内存区3、全局/静态内存区4、

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

下面使用日常开发中的编程实例,详细介绍一下这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++代码对应的汇编代码:

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

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

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

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

程序会发生崩溃。

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

2、堆内存区

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

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

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

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

 程序直接闪退崩溃。

3、全局/静态内存区

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

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


extern int m_nClientId;

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


static int nCount;

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

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

4、文字常量区

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


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

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

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

5、程序代码区

       前面说的内存都是数据段的内存,是用来存放程序运行中的各种数据的;该部分的内存是代码段的内存,是用来存放程序二进制代码的。
      数据段的内存地址和代码段指令的地址,完全是两个概念,不能混为一谈。比如某个变量的内存地址是数据段的地址:

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

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

到此这篇关于C++程序的五大内存分区实例详解的文章就介绍到这了,更多相关C++ 五大内存分区内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++程序的五大内存分区实例详解

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++程序的五大内存分区实例详解
    目录1、栈内存区1.1、调用函数时通过栈来传递函数的参数值       1.2、线程占用的栈内存是有上限的2、堆内存区3、全局/静态内存区4、...
    99+
    2022-11-12
  • c/c++内存分配大小实例讲解
    测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小。单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "he...
    99+
    2022-11-12
  • C++ 面向对象程序设计--内存分区详解
    目录一、分区的意义二、代码区1、定义2、特点三、全局区1、定义2、特点3、相关代码1)全局变量2)静态变量四、栈区——程序运行后1、定义2、相关代码五、堆区——运行后1、定义2、相关...
    99+
    2022-11-12
  • C++核心编程之内存分区详解
    目录1、内存分区模型:2、代码区:3、全局区:4、小结:5、代码演示:6、运行结果:总结1、内存分区模型: C++程序在执行时,将内存大方向划分成4个区域 (1)代码区:存放安徽念书...
    99+
    2022-11-13
  • C++程序内存栈区与堆区模型案例分析
    目录栈区:栈区代码演示:堆区:堆区代码演示:new操作符:new操作符代码演示:栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死&rdqu...
    99+
    2022-11-13
  • C++程序的内存分区有哪些
    小编给大家分享一下C++程序的内存分区有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C++程序在运行时所占用的内存区域,一般可分为栈内存区、堆内存区、全局/...
    99+
    2023-06-25
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2022-11-13
  • 小程序页面间传参的五种方式实例详解
    目录前言1、使用globalData2、使用storage3、使用url3.1 api跳转3.2 组件跳转4、使用通信通道5、使用页面栈总结前言 由于经常需要进行页面间传参且各种传参...
    99+
    2022-11-13
    小程序 传参 微信小程序传参 微信小程序 页面传数据
  • C语言程序中结构体的内存对齐详解
    目录一、为什么存在内存对齐二、结构体的内存对齐四规则三、举例一、为什么存在内存对齐 1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某...
    99+
    2022-11-13
    C语言结构体内存对齐 C语言 内存对齐 C语言 结构体
  • Linux下c++程序内存泄漏检测代码的示例分析
    这期内容当中小编将会给大家带来有关如何解决Linux下c++程序内存泄漏检测代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrin...
    99+
    2023-06-17
  • C++ 操作系统内存分配算法的实现详解
    目录一、实验目的二、实验内容三、实验要求四、代码实现 五、测试样例一、实验目的 通过本实验帮助学生理解在动态分区管理方式下应怎样实现主存空间的分配和回收。 二、实验内容 在动态分区管...
    99+
    2022-11-12
  • 如何解决C程序中Ubuntu、stm32的内存分配问题
    这篇文章主要介绍了如何解决C程序中Ubuntu、stm32的内存分配问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、内存分区概念介绍1.1、C/C++编译程序的内存占用...
    99+
    2023-06-22
  • 一个分析和解决Java应用程序内存浪费的实战例子,值得收藏!
    内存是当今世界上被广泛浪费的硬件资源之一。由于编程效率低下,惊人量的内存浪费被浪费了。这种模式在多个企业应用程序中重复出现。为了证明这种情况,我们进行了一项小型研究。...
    99+
    2023-06-04
  • C#控制台程序的开发与打包为一个exe文件实例详解
    目录前言一、我的第一个C#控制台程序1.打开 Visual Studio 选择创建新项目2.语言选择 C# ,系统选择 Windows3.确定项目名称和位置,点击创建4.输入代码5....
    99+
    2023-05-19
    c#控制台程序例子 c#控制台应用程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作