堆与栈区别,以及分配内存的快慢

毫无疑问,显然从栈上分配内存更快,因为从栈上分配内存仅仅就是栈指针的移动而已

操作系统会在底层对栈提供支持,会分配专门的寄存器存放栈的地址,栈的入栈出栈操作也十分简单,并且有专门的指令执行,所以栈的效率比较高也比较快。而堆的操作是由C/C++函数库提供的,在分配堆内存的时候需要一定的算法寻找合适大小的内存。并且获取堆的内容需要两次访问,第一次访问指针,第二次根据指针保存的地址访问内存,因此堆比较慢。在堆区上申请与释放内存是一个相对复杂的过程,因为堆本身是需要程序员(内存分配器实现者)自己管理的,而栈是编译器来维护的,堆区的维护同样涉及内存的分配与释放,但这里的内存分配与释放显然不会像栈区那样简单,一句话,这里是按需进行内存的分配与释放本质在于堆区中每一块被分配出去的内存其生命周期都不一样,这是由程序员决定的,我倾向于把内存动态分配释放想象成去停车场找停车位。

? 堆和栈有什么区别

  • 从定义上:堆是由new和malloc开辟的一块内存,由程序员手动管理,栈是编译器自动管理的内存,存放函数的参数和局部变量。
  • 堆空间因为会有频繁的分配释放操作,会产生内存碎片
  • 堆的生长空间向上,地址越来越大,栈的生长空间向下,地址越来越小
  • 堆的内容是程序员自己提供,并维护,在堆上申请空间用完需要释放掉,防止内存泄漏
  • 分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现的方式类似于链表(记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。

你可能感兴趣的:(开发语言,c++)