大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。第二十六天还是继续和大家一起学习 Rust😊
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
Box
Box 它是 Rust 中最基本的在堆上分配内存的方式,绝大多数其它包含堆内存分配的数据类型,内部都是通过 Box 完成的
Box 的定义里,内部就是一个 Unique 用于致敬 C++,Unique 是一个私有的数据结构,我们不能直接使用,它包裹了一个 *const T 指针,并唯一拥有这个指针。
pub struct Unique<T: ?Sized> {
pointer: *const T,
// NOTE: this marker has no consequences for variance, but is necessary
// for dropck to understand that we logically own a `T`.
//
// For details, see:
// <https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data>
_marker: PhantomData<T>,
}
设计内存分配器的目的除了保证正确性之外,就是为了有效地利用剩余内存,并控制内存在分配和释放过程中产生的碎片的数量。在多核环境下,它还要能够高效地处理并发请求。
堆上分配内存的 Box 其实有一个缺省的泛型参数 A,就需要满足 Allocator trait,并且默认是 Global:
pub struct Box<T: ?Sized,A: Allocator = Global>(Unique<T>, A)
Allocator trait 提供很多方法:
-
allocate 用于分配内存
-
deallocate 用于释放内存
-
grow / shrink 用来扩大或者缩小堆上已经分配的内存
此文章为2月Day5学习笔记,内容来源于极客时间《Rust 编程第一课》