什么是布局?

Sof*_*fle 5 memory-management rust

我想更好地重新实现在防锈(主要是盒),以了解它的一些STDLIB智能指针,我来自一个C的背景,其具有简单mallocfree功能,但锈蚀的allocdealloc需要一些Layout。它是什么?文档中并没有真正解释它。

use*_*342 9

正如其文档所说,Layout描述了要分配或释放的内存块。除了内存大小,它还指定对齐方式和可选的块的尾随填充。

Cmalloc没有被告知要使用什么对齐方式,因此它必须假设最坏情况下的对齐方式,可能会浪费内存。即使在 C 中,有时也需要非标准对齐的内存,为此必须使用标准 C 之外的API直到C11

Rust 和 C 的分配器接口之间的最后一个区别是,Rust 要求将布局传递给dealloc以及 to alloc- 相当于 Cfree需要传递给 的大小malloc。起初这听起来像是一个缺点,因为 API 的用户必须跟踪分配的大小才能解除分配。但事实证明这在实践中不是问题,因为:

  • 分配单个值(例如Box<T>或 array )时Box<[T; n]>,大小在编译时确定,因此在Box::drop调用时知道。

  • 分配动态数组时,例如Vec<T>,向量的容量由向量本身跟踪,因此也可在 中使用Vec::drop

  • 对切​​片进行装箱时,例如Box<[T]>,切片无法调整大小,其容量等于其长度,并且再次已知Box::drop

所以事实证明是 C 风格的分配 API 导致存储冗余大小信息。传递大小以dealloc消除冗余,提供节省空间的机会,特别是对于大小信息在所用内存中占不可忽略百分比的小块。

在将 Rust 的分配接口与 C 的分配接口进行比较时,请记住,在 Rust 中,原始分配更像是一种专门的工具,仅用于实现安全抽象,例如Box,RcVec。与 C 不同,程序员通常需要调用mallocfree,大多数 Rust 程序员从不需要直接调用全局分配器。

  • 实际上,从 C11 开始,C 获得了 [`aligned_alloc`](https://en.cppreference.com/w/c/memory/aligned_alloc) 来处理更大的对齐,不再需要特定于平台的 API。 (2认同)