C++程序内存分配方式概念与区别(堆与栈)

2023-05-16

一、内存布局

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈。

2、堆区(heap):一般由程序员分配释放,与数据结构中的堆毫无关系,分配方式类似于链表。

3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。

4、文字常量区:存放常量字符串。

5、程序代码区:存放函数体(类的成员函数、全局函数)的二进制代码

二、栈与堆的比较

1、申请方式

stack:系统自动分配,如声明int a;系统自动在栈空间中为a开辟空间

heap:程序员申请,并指明大小,c中的malloc,如char*p=(char*)malloc(10);

    C++中的new运算符:如int*p2=new int(10);

    注意:p和p2本身是在栈中的,但他们指向的地址是堆空间

2、系统响应

栈:只要系统剩余空间大于申请空间就能申请,否则报错:栈溢出

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数系统,首地址处会记录这块内存空间中本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

3、申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。由此可见,堆获得的空间受限于计算机系统中有效的虚拟内存,比较灵活,也比较大。

4、申请效率

栈由系统自动分配速度较快,堆由new分配速度较慢,且容易产生内存碎片,但使用方便。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++程序内存分配方式概念与区别(堆与栈) 的相关文章

随机推荐

  • 计算机操作系统执行可执行程序时,内存分配详解

    处理器遇到的地址都是虚拟地址 xff0c 虚拟地址和物理地址都分成页码 xff08 页框 xff09 和偏移量俩部分组成 在虚拟地址转换成物理地址的过程中 xff0c 偏移值不变 xff0c 而页码和页框码之间的映射就在一个映射记录表 页表
  • 应用程序进程,内存,虚拟内存之间的关系详解(2)

    浅谈操作系统与内存 对于计算机的发明 xff0c 相信大家都有耳闻那个占地面积按平米算的第一台计算机 在那个时候 xff0c CPU的资源是极其珍贵的 xff0c 随着这些年突飞猛进的发展 xff0c 一片指甲盖大小的民用级CPU一秒钟能执
  • 虚拟内存概念解疑

    虚拟内存别称 虚拟存储器 xff08 Virtual Memory xff09 电脑 中所运行的 转存失败重新上传取消 程序均需经由 内存执行 xff0c 若执行的程序占用内存很大或很多 xff0c 则会导致内存消耗殆尽 为解决该问题 xf
  • 计算机系统中虚拟内存概念解疑(1)

    处理器遇到的地址都是虚拟地址 xff0c 虚拟地址和物理地址都分成页码 xff08 页框 xff09 和偏移量俩部分组成 在虚拟地址转换成物理地址的过程中 xff0c 偏移值不变 xff0c 而页码和页框码之间的映射就在一个映射记录表 页表
  • 计算机系统中虚拟内存概念解疑(2)

    虚拟内存机制 1 计算机的存储系统 2 为什么要有虚拟内存 在早期的计算机中 xff0c 是没有虚拟内存的概念的 我们要运行一个程序 xff0c 会把程序全部装入内存 xff0c 然后运行 当运行多个程序时 xff0c 经常会出现以下问题
  • windows系统内存结构概述(重要概念释疑)

    13 1 Windows的虚拟地址空间安排 13 1 1虚拟地址空间的分区 xff08 即虚拟地址空间布局 xff09 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Windows X64 64位
  • 地址总线,字长,内存容量,寻址范围 之间的计算

    注意 xff1a 由于虚拟内存技术 xff0c 在经典32位桌面操作系统中 xff0c 有32条地址线 特殊情况下可能36条 xff0c 那么CPU可直接寻址到的内存空间为2 32字节 xff0c 也就是4GB 虽说内存寻址可以到4G xf
  • Android 10 开机启动sh脚本

    客户需求要在sdcard目录下增加文件和文件夹 开机后增加运行sh脚本 xff0c 脚本中执行mkdir和cp操作 1 拷贝客户文件和脚本 PRODUCT COPY FILES 43 61 device mediatek vendor co
  • 问题笔记0

    1 数据库连接及命令没有关闭释放导致操作被占用 2 内存没有释放导致内存不断增加导致软件崩溃 3 c socket的bind地址函数第一个参数不对默认可能不是IP4导致bind地址失败
  • C++程序开启大地址(虚拟内存),让32位程序使用4G内存的方法,虚拟内存概念及寻址范围详解

    如何让 32 位程序突破 2G 内存限制 一般情况下 xff0c 32 位程序的内存大小被限制在了 2G xff0c 不过可以通过以下的操作来突破这个限制 修改操作系统参数 这一步骤只针对 32 位操作系统 xff0c 64 位操作系统可以
  • 虚拟内存概念3

    1 物理内存 1 1 物理内存概述 1 2 直接使用物理内存的问题 1 2 1 多进程地址布局困难 1 2 2 进程地址空间小 1 2 3 程序链接不统一 2 虚拟内存 2 1 引入虚拟内存的目的 2 2 局部性原理与虚拟内存 2 3 虚拟
  • 计算机程序虚拟内存寻址最大范围(决定因素)与程序最大内存之间的关系详解

    在早期的计算机中 xff0c 程序都是直接运行在物理内存上的 xff0c 意思是运行时访问的地址都是物理地址 xff0c 而这要求程序使用的内存空间不超过物理内存的大小 在现代计算机操作系统中 xff0c 为了提高CPU的利用率计算机同时运
  • QT中线程安全退出实例

    1 QThread安全退出 线程创建以及退出示例 创建 TestObject object 61 new TestObject QThread thread 61 new QThread object gt moveToThread thr
  • qt中连接sqlite数据库提示QSQLITE driver not loaded解决办法(重要)

    如下 xff0c 经测试无效 xff0c 最后发现是plugins文件夹找错位置了 Qt加载数据库时 xff0c 数据库驱动必须放在sqldrivers文件夹下 xff0c 1 将Qt安装程序的plugins sqldrivers路径复制到
  • c#操作SQLite, 判断表、字段是否存在,新增、删除、重命名列实例

    SQLiteHelper class 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
  • c#求STDEV标准偏差方法

    public static float StDev float arrData 计算标准偏差 float xSum 61 0F float xAvg 61 0F float sSum 61 0F float tmpStDev 61 0F i
  • QT中QMap使用实例详解

    QMap QMultiMap属于关联式容器 xff0c 其底层结构是通过二叉树实现 xff0c 故其查找value的效率很快 QMap中的数据都是成对出现的 xff0c 第一个称为key xff08 键 xff09 xff0c 第二个称va
  • C++中函数调用的整个过程内存堆栈分配详解

    一个函数执行过程中堆栈分配情况实例详解 下面的例子可以完全展示不同的变量所占的内存区域 xff1a main cpp int a 61 0 全局初始化区 char p1 全局未初始化区 main int b 栈中 char s 61 34
  • vncserver创建与客户端连接

    1 xff0e 确认服务器端是否安装了 vncserver Vnc 相关依赖包 xff1a gtk vnc python 0 3 2 3 el5 vnc server 4 1 2 14 el5 gtk vnc 0 3 2 3 el5 vnc
  • C++程序内存分配方式概念与区别(堆与栈)

    一 内存布局 1 栈区 xff08 stack xff09 xff1a 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量值等 xff0c 其操作方法类似数据结构中的栈 2 堆区 xff08 heap xff09 xf