Sof*_*fle 5 memory-management rust
我想更好地重新实现在防锈(主要是盒),以了解它的一些STDLIB智能指针,我来自一个C的背景,其具有简单malloc和free功能,但锈蚀的alloc和dealloc需要一些Layout。它是什么?文档中并没有真正解释它。
正如其文档所说,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。
所以事实证明是 C 风格的分配 API 导致存储冗余大小信息。传递大小以dealloc消除冗余,提供节省空间的机会,特别是对于大小信息在所用内存中占不可忽略百分比的小块。
在将 Rust 的分配接口与 C 的分配接口进行比较时,请记住,在 Rust 中,原始分配更像是一种专门的工具,仅用于实现安全抽象,例如Box,Rc或Vec。与 C 不同,程序员通常需要调用malloc和free,大多数 Rust 程序员从不需要直接调用全局分配器。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |