C++中的栈内存与堆内存

一、栈内存和堆内存的定义

栈内存:
由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。若分配失败,则提示栈溢出错误。注意,const局部变量也储存在栈区内,栈区向地址减小的方向增长。

堆内存:
程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。分配的速度较慢,地址不连续,容易碎片化。此外,由程序员申请,同时也必须由程序员负责销毁,否则则导致内存泄露。


二、栈和堆的区别

1、管理方式不同
栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。

2、空间大小不同
栈的空间有限;堆内存空间很大。

3、能否产生碎片不同
栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete 会造成内存的不连续,从而造成大量的碎片。

4、生长方向不同
堆的生长方式是向上的,栈是向下的。

5、 分配方式不同
堆是动态分配的。栈可以是静态分配和动态分配两种,但是栈的动态分配由编译器释放。

6、缓存级别不同:
  1)、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
  2)、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿象就能被回收)。所以调用这些对象的速度要相对来得低一些。

7、分配效率不同
  栈是机器系统提供的数据结构,计算机底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令。堆则是由C/C++函数库提供,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
  堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,推荐尽量用栈,而不是用堆。

注意:栈和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。 无论是堆还是栈,都要防止越界现象的发生。


三、关于堆内存和栈内存区别的比喻

第一种比喻:

栈内存: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
堆内存: 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

第二种比喻:

栈内存: 栈内存的速度快,就像超市里面的取货区,或者展览区。但是因为栈内存的空间小,放的东西很少。
堆内存: 堆内存就像是大的仓库,可以放很多的东西。

C++ 之栈内存与堆内存详解相关推荐

  1. 栈内存和堆内存的区别(一个笔试题的一部分)

    笔试题目:请解释一个栈内存与一个堆内存的区别,请分析下面代码运行是否有问题,如果有问题请改正. char* GetMemory(void) { char p[] = "Hello world ...

  2. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  3. JavaScript变量——栈内存or堆内存

    原文  http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...

  4. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  5. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

  6. 数据类型,栈内存、堆内存

    一.基础数据类型 二.栈和堆的区别 三.栈内存.堆内存 四.栈.队列.树.链表 基础数据类型 我把它总结为:USONB(是不是很nice哈哈) Undefined.String.Symbol.Obje ...

  7. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  8. 栈内存和堆内存的区别

    总结: 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. 除了这两部分,还有一 ...

  9. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

最新文章

  1. shell python优势_python的优势
  2. 大连东软信息学院计算机专业19分数线,2021大连东软信息学院录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
  3. [Qt]QLabel的显示圆形
  4. win7装sql2000找不到服务器,Win7怎么正确安装使用sql2000教程
  5. 融云主办 WICC 2020 探寻互联网通信云技术风向标
  6. spring基于注解的AOP配置 中的环绕通知 步骤写法
  7. 散文:dflow 是如何实现slice的
  8. D2 日报 2019年3月20日
  9. 微软的一道前端面试题
  10. 港大黄凯斌:6G时代的边缘智能,香农与图灵的相遇
  11. 搭建Jumpserver服务器管理公司服务器
  12. 「项目进度管理」如何编制有效的进度计划?
  13. PCB板的跨分割设计
  14. java s3_Amazon S3 功能介绍
  15. 从云技术风向标看2022企业数字化转型战略方向
  16. db2嵌套查询效率_提高 DB2 查询性能的常用方法
  17. Pytorch实现GAT(基于Message Passing消息传递机制实现)
  18. 剩余极化强度、电滞回线、饱和极化强度
  19. jsch mysql_Java程序:使用JSch和JDBC通过SSH连接到MySQL
  20. 200条装修小常识(2)

热门文章

  1. win8.1适合哪个版本的linux,紧跟Win8!全面体验最适合国人的深度Linux
  2. lightroom最新版本下载_win10系列之如何最快速从微软官网下载最新版本iso映像
  3. cocos2dx的渲染机制
  4. 一级建造师-通信-必学问题
  5. 关于透视投影的深入理解
  6. UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)
  7. appium报错Killing adb server on port 5037问题,及pycharm连接不到Android设备问题
  8. 安卓webview软键盘遮住底部按钮,又名AndroidBug5497
  9. 简易聊天室(C语言)
  10. 如何用正则表达式匹配汉字