gpt4 book ai didi

memory-management - 什么是布局?

转载 作者:行者123 更新时间:2023-12-03 11:24:09 25 4
gpt4 key购买 nike

我想在 rust(主要是 Box)中重新实现一些 stdlib 智能指针以更好地学习它,我来自 C 背景,具有简单的 mallocfree功能,但 rust 的 allocdealloc需要一些Layout .它是什么?文档中并没有真正解释。

最佳答案

正如其文档所述, Layout 描述要分配或释放的内存块。除了内存大小之外,它还指定对齐方式和可选的 block 的尾随填充。
C的malloc没有被告知要使用哪种对齐方式,因此它必须假设最坏情况下的对齐方式,这可能会浪费内存。即使在 C 中,有时也需要非标准对齐的内存,为此 API outside of standard C必须使用到 C11 .
Rust 和 C 的分配器接口(interface)之间的最后一个区别是 Rust 需要将布局传递给 dealloc 。以及 alloc - 相当于 C 的 free需要传递给 malloc 的大小.起初这听起来像是一个缺点,因为 API 的用户必须跟踪分配的大小才能解除分配。但事实证明这在实践中不是问题,因为:

  • 分配单个值时,例如 Box<T>或数组 Box<[T; n]> ,大小在编译时确定,因此在 Box::drop 时知道被调用。
  • 分配动态数组时,如Vec<T> ,向量的容量由向量本身跟踪,因此在 Vec::drop 中也可用.
  • boxing a slice ,如 Box<[T]> ,切片无法调整大小,其容量等于其长度,并且再次为 Box::drop 所知.

  • 所以事实证明是 C 风格的分配 API 导致存储冗余大小信息。将大小传递给 dealloc消除了冗余,提供了节省空间的机会,特别是对于大小信息占所用内存百分比不可忽略的小块。
    将 Rust 的分配接口(interface)与 C 的分配接口(interface)进行比较时,请记住,在 Rust 中,原始分配更像是一种专用工具,仅用于实现安全抽象,例如 Box , RcVec .与 C 不同,在 C 中,程序员通常会调用 malloc。和 free ,大多数 Rust 程序员从不需要直接调用全局分配器。

    关于memory-management - 什么是布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63981598/

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