堆和栈的内存管理区别

10 篇文章 0 订阅
本文详细介绍了C++中栈、堆和静态对象的内存管理区别,包括它们的分配方式、效率、空间大小以及生命周期。栈对象自动管理,分配速度快但容量有限;堆对象需要手动管理,容量大但效率较低;静态对象在程序运行期间存在,便于类间通信。同时,讨论了内存分布和缓存层次,指出栈在一级缓存,堆在二级缓存,导致栈的访问速度更快。
摘要由CSDN通过智能技术生成

数据结构的差异

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

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读写速率:
寄存器 > 一级缓存 > 二级缓存
栈是在一级缓存里面的,堆是属于二级缓存,所以栈的效率比堆的高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hokool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值