堆与栈的效率的比较

堆和栈作为C/C++中最常用的内存类型,我们知道对于小的数据要使用栈内存、对于大的数据要使用堆内存,但是在高性能优化中,友好的使用栈将会极大的提高运行效率,减少访存的频率,那么堆和栈的效率究竟有啥区别呢?

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:C/C++精进之路
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

目录

1 堆和栈特点概述

2 栈分配的软件优势分析

3 栈分配的硬件优势

4 栈快的操作系统层分析


1 堆和栈特点概述

 a. 存储方式:堆是从低地址向高地址增长的,栈是从高地址到低地址增长的

 b. 存储结构:堆是动态存储、链式存储;栈是有序存储、顺序存储;数据结构最本质的存储方式只有顺序存储和链式存储。

 c. 数据操作原则:堆是先进先出(FIFO),栈是后进先出(LIFO)

 d. 内存管理:堆由OS管理,栈由程序员手动管理

 e. 生存周期:堆在程序员手动释放时结束,栈函数调用完成后结束,一般而言,堆的生存周期比较长

 f. 数据存储效率、大小、信息:堆主要存储动态生命周期的对象和数据结构,空间可以很大,效率较低;栈主要存储函数调用时需要的变量和返回值,空间比较小,效率较高。

2 栈分配的软件优势分析

栈分配算法简单,所以高效;堆分配算法相对比较复杂。

3 栈分配的硬件优势

硬件优势主要是:cache和内存映射。
        a.如果在 栈上分配小块内存,因为cache和内存映射已经建立 ,则效率会非常高,远远优于堆分配。

        b.如果在栈上分配大块内存,在不考虑爆栈的情况下,其实两者效率差不到哪去。因为cache命中和内存映射总是在有限的大小进行的,其在栈中分配的大块内存照样cache不命中,而且映射未建立,所以这样的时间相差其实并不太多。

4 栈快的操作系统层分析

1.分配和释放堆在分配和释放时都要调用函数(MALLOC,FREE),比如分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成空洞),这些都会花费一定的时间,具体可以看看MALLOC和FREE的源代码,他们做了很多额外的工作,而栈却不需要这些。

2.访问时间,访问堆的一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。另外,堆的内容被操作系统交换到外存的概率比栈大,栈一般是不会被交换出去的。

3.系统层面

        a. 栈有专门的寄存器,压栈和出栈的指令效率很高,而堆需要由OS动态调度,堆内存可能被OS调度在非物理内存中,或是申请内存不连续,造成碎片过多等问题。
        b. 分配方式上,堆都是动态分配的,栈是编译器完成的。栈的分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

        c. 由于栈和堆使用的都是用户空间的虚拟内存,对于作为函数参数,通过指针引用的情况。非要说有区别,可能是第一次访问该内存的时候有可能更快些,理由是当你调用函数是,只想的栈内存一定已经加载到物理内存里面了,页表也已经建好了(在该页没有被置换出去的情况下);指向堆的内存不一定已经映射到物理内存,因此需要处理缺页,建立页表。至于指向的内存都已经加载到物理内存的情况,应该没有区别

        d. 栈内存更快,栈是和代码段一同被载入到CPU内存中的,用C写得程序在被编译成机器指令之后,同一个函数栈上的变量会被保存在寄存器中的,并且栈上的内存基本上都是在编译的时候就确定了得,由于CPU的运算原理明显依赖寄存器的,所以栈上的内存访问速度明显比堆上快,现在CPU的设计一、二级缓存的大小已经最后栈内存的使用,所以效率明显要高很多,而堆上的内存由于和函数栈不在同一个地址段,所以堆上的内存很有可能不在寄存器或者CUP缓存中,访问命中率就低,同时效率也就会低很多,因为要出发好多系统内核调用,内存需要从硬盘到内存到CUP缓存再到寄存器。

        e. 栈效率更高,因为堆分配分配了之后还要与存储器之间建立映射,而栈分配则是之前就建立好了。

        f. 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,而堆是C++函数库提供的,机制比较复杂,所以栈的分配效率比堆的效率高。

🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发狂的小花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值