堆和栈的内存管理区别

  • 数据结构的差异
  • C++中堆和栈的区别
  • 三种内存对象的比较
  • 内存分布上的堆和栈
  • 一级缓存和二级缓存

数据结构的差异

堆:先进先出
栈:先进后出的、自顶向下

C++中堆和栈的区别

  • 管理方面,需要自己分配、清除
  • 空间大小方面,堆最大可达4G(32位),而栈大小有限制,一般8M
  • 碎片方面:堆分配和回收一段时间后可能产生碎片,栈一定不会
  • 生长方向:栈往低地址生长,堆往高地址生长
  • 分配方式:栈可动态分配也可静态分配,堆只能动态分配
  • 分配效率:栈是机器系统提供的数据结构,而堆是语言层提供的数据结构,效率不一样
  • 栈其实要比堆快,原因在于:
    (1) 栈是本着LIFO原则的存储机制,对栈数据的定位相对比较快速,而堆则是随机分配的空间,处理的数据比较多,无论如何,至少要两次定位
    (2) 栈是由CPU提供指令支持的,在指令的处理速度上,对栈数据进行处理的速度自然要优于由操作系统支持的堆数据
    (3) 栈是在一级缓存中做缓存的,而堆则是在二级缓存中,两者在硬件性能上差异巨大
    (4) 各语言对栈的优化支持要优于对堆的支持,比如swift语言中,三个字及以内的struct结构,可以在栈中内联,从而达到更快的处理速度

三种内存对象的比较

栈对象:

  1. 栈对象的优势是在适当的时候自动生成,又在适当的时候自动销毁,不需要程序员操心;
  2. 栈对象的创建速度一般较堆对象快。因为分配堆对象时,会调用operator new操作,operator new会采用某种内存空间搜索算法,而该搜索过程可能是很费时间的,产生栈对象则没有这么麻烦,它仅仅需要移动栈顶指针就可以了
  3. 通常栈空间容量比较小,一般是1MB~2MB,所以体积比较大的对象不适合在栈中分配
  4. 特别要注意递归函数中最好不要使用栈对象,因为随着递归调用深度的增加,所需的栈空间也会线性增加,当所需栈空间不够时,便会导致栈溢出,这样就会产生运行时错误

堆对象:

  1. 其产生时刻和销毁时刻都要程序员精确定义
  2. 相比于栈空间,堆的容量要大得多

静态对象:

  1. 全局对象:全局对象为类间通信和函数间通信提供了一种最简单的方式
  2. 类的static成员:属于类,为所有类对象所共享
  3. 局部静态对象:主要可用于保存该对象所在函数被屡次调用期间的中间状态

内存分布上的堆和栈

堆:也称为动态内存分配,是由我们自己在程序中分配内存和释放的,就是生存期是由我们自己决定的如malloc函数(注意避免内存泄漏)
栈:局部变量的内存,函数结束后内存自动被释放,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限

一级缓存和二级缓存

为什么需要缓存?
CPU运行速度很快,内存就很慢,所以就需要缓存,缓存分为一级二级三级,越往下优先级越低,成本越低,容量越大
CPU读写速率:
寄存器 > 一级缓存 > 二级缓存
栈是在一级缓存里面的,堆是属于二级缓存,所以栈的效率比堆的高

堆和栈的内存管理区别相关推荐

  1. C++__堆,栈与内存管理

    C++__堆,栈与内存管理 1.什么是栈,什么是堆 具体可以看这篇:转载[C]堆区和栈区的区别 2.静态变量,全局变量,堆,栈生命周期 3.new与delete的动作 4.动态分配的内存计算 参考:& ...

  2. C++面向对象高级开发(侯捷)——堆、栈与内存管理

    stack(栈),heap(堆) Stack:是存在于某作用域(scope)的一个内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,返回地址 ...

  3. 堆和栈的联系与区别(转贴)

    总结的不错. Part 1: 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内 ...

  4. Java面试--堆和栈的概念和区别

    堆和栈的概念和区别[转载自博客] 在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的 ...

  5. linux 和windows 内存管理区别

    linux 和windows 内存管理区别 在 80 年代初,IBM 推出的 IBM PC 机采用了 Intel 16 位的 8088 处理器,该处 理器可以访问最多 1MB 的存储器.当应用程序需要 ...

  6. 【转载】堆和栈的内存分配

    原文:堆和栈的内存分配 在这个练习中,你会在难度上做一个大的跳跃,并且创建出用于管理数据库的完整的小型系统.这个数据库并不实用也存储不了太多东西,然而它展示了大多数到目前为止你学到的东西.它也以更加正 ...

  7. 堆、栈、队列的区别和联系

    数据结构中的堆.栈和队列 堆:堆是一种经过排序的树形数据结构,每个结点都有一个值.通常我们所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个 ...

  8. 队列、堆、栈、堆栈的区别?

    队列.堆.栈.堆栈的区别? vs2005资料 2008-10-08 21:28:52 阅读467 评论1   字号:大中小 订阅 队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就可以先出去 ...

  9. 进程、线程、堆、栈的理解和区别!

    一:进程和线程的定义 (1)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.  (2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是 ...

最新文章

  1. 滴滴联合比亚迪:首款定制网约车D1发布
  2. 艾伟_转载:C#语言基础常见问题汇总
  3. WebRTC 音频模块单独编译 --【转载】
  4. 第四十八期:只因写了一段爬虫,公司200多人被抓!
  5. Android菜鸟如何学习Android系统开发?
  6. java判断一个整数是不是素数(质数)
  7. 基于CSS3实现元素宽度向两侧延伸
  8. 计算机网络 ospf重点,计算机网络:OSPF协议概述
  9. BP神经网络的MATLAB实现
  10. 神经网络造“汉字”新技能全开,biangbiang面自愧不如
  11. Elasticsearch的javaAPI之get,delete,bulk
  12. 悬浮窗一个怎么够?微信新版本满足你的一心多用
  13. Python_一元线性回归及回归显著性
  14. js使用策略模式实现表单验证
  15. do while和while的区别
  16. 中小企业OA管理系统(微鳄OA私有化部署)
  17. 【飞郁2022新课程】23 - CE找偏移表达式
  18. 详解C语言实现扫雷游戏
  19. h5 or web缅甸语乱码问题
  20. 用umi脚手架初始化项目提示在此系统禁止运行脚本是为什么?

热门文章

  1. C++后端面试(应届)
  2. 计算机行业pc啥意思,pc是什么意思?关于pc材料的介绍
  3. Fedora 14 安装 DDD过程
  4. 大白话讲解MySQL 索引,页分裂,行溢出,事务
  5. linux查看文件总和以G为单位,linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息...
  6. 华为设备Telnet远程登录配置
  7. Qt MySQL报“QMYSQL driver not loaded driver not loaded“,终极解决办法
  8. css文件内容格式化
  9. 带着upp闯关----性能考验
  10. vage mysql_MySql下视图的创建