gpt4 book ai didi

rust - 在 Rust 中什么在栈上,什么在堆上?

转载 作者:行者123 更新时间:2023-11-29 08:10:28 31 4
gpt4 key购买 nike

我对 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 的值没有任何特殊注释生活在堆上。

  1. 到底什么在栈上,什么在堆上?

  2. 是执行MyBox<T>Box<T> 基本相同?

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

  4. 如果实现不相同,是什么导致了 Box<T>在堆上分配内存?

最佳答案

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

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

  2. 一点也不!这本书在这里简化了一些事情,以避免对本节不重要的细节。

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

关于rust - 在 Rust 中什么在栈上,什么在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52616310/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com