首页 文章

什么在堆栈上和Rust中的堆上发生了什么?

提问于
浏览
0

我对Rust的内存分配系统感到很困惑 .

在Java中,您使用 new 在堆上分配内存 . 在C中你使用 malloc() ,其他一切都在堆栈上 .

我想,在Rust中, Box<T> 在堆上分配内存但是在读完"Defining Our Own Smart Pointer" section in chapter 15.2 in The Rust Programming Language之后,似乎 MyBox<T> 没有任何特殊的注释来使 T 的值存在于堆上 .

  • 堆栈究竟是什么以及堆上发生了什么?

  • MyBox<T> 的实现与 Box<T> 基本相同吗?

  • 如果实现相同,是什么使 T 存储在堆而不是堆栈上?

  • 如果实现不相同,那么 Box<T> 在堆上分配内存是什么?

1 回答

  • 5
    • 这很难说 . 通常Rust会避免在堆上分配任何东西 . 编译器永远不会在堆上执行隐式分配,但库函数可以为您执行此操作 . 至少任何动态大小的东西(例如 Vec<T> )都需要在引擎盖下的堆上,其余的文档应该提示它 .

    请注意,即使在C中,许多函数也可以在没有显式调用 malloc 的情况下进行堆分配 . 例如 . 最近我不得不调试内存泄漏,开发人员在没有相应的 freeaddrinfo 的情况下调用了getaddrinfo,忽略了这个函数在堆上分配内存 . 但是,由于RAII,Rust中的这类错误应该非常少见 .

    • 完全没有!本书简化了这里的内容,以避免对本节不重要的细节 .

    • Box 是内置的编译器 . 分配内存的是在liballoc中定义的分配器 . 您可以将此分配器视为提供类似 malloc 的功能 . 实际上,默认分配器在大多数目标上使用jemalloc,也可以使用自定义分配器,例如alloc_system crate使用系统的 malloc / realloc / free 函数来构建其分配器 .

相关问题