堆和栈的内存管理区别

堆和栈的内存管理区别

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

你可能感兴趣的:(C/C++,学习,安全,后端,服务器)