2026-01-15
后端技术
00

目录

内存分配的区别
数据结构的区别

相关信息

堆栈的区别

内存分配的区别

  • 栈内存
    • 分配方式:由编译器自动分配和释放
    • 存储内容: 函数的局部变量、参数值、返回地址
    • 生长方向: 向低地址生长
    • 连续的内存区域
    • 异常类型: 栈溢出
    • 访问速度: 快
  • 堆内存
    • 分配方式: 由程序员手动申请和释放(go中的new),go中由垃圾回收期处理
    • 存储内容: 动态生成的对象,大型数组
    • 访问速度:慢(随机访问较多)
  • go中堆栈的情况
js
Go 等现代语言中,变量到底在堆还是栈,不完全由程序员决定。 如果一个局部变量在函数结束后还要被外部引用(比如返回了它的指针),编译器会将其**“逃逸”到堆上**。 优化建议:频繁在堆上分配小对象会加重 GC 负担。如果能利用栈分配(不逃逸),程序的运行效率会显著提升。

数据结构的区别

  • 栈 (stack)
    • 后进先出,主要操作是push和pop
  • 堆(heap)
    • 逻辑上是一个完全二叉树,分为大碓顶和小堆顶

    • 物理上是一个数组

      • 由于堆是一棵完全二叉树(除了最后一层,其他层都是满的,且最后一层从左往右填充),它没有空洞。这使得我们可以用数组下标直接计算出节点之间的关系,而不需要指针。
      js
      假设某个节点的下标为 $i$(从 0 开始计数): 左子节点下标:$2i + 1$ 右子节点下标:$2i + 2$ 父节点下标:$(i - 1) / 2$(向下取整)
    • 主要操作删除和插入(上浮和下沉)

image.png

本文作者:曹子昂

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!