正如标题所说。
pub unsafe trait Allocator {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
}
Allocator
上的两个必需方法都采用不同的指针类型,这对我来说似乎很奇怪。为什么做出这样的选择?
此外,为什么选择
u8
和[u8]
?为什么两种方法不只使用 NonNull<()>
或 NonNull<[()]>
呢?
我的理解是,选择
[u8]
或 u8
是一个好主意,因为它具有实际可以分配的最不严格的布局要求(因为 Layout
要求 align
非零)。但是,我认为每次都需要演员表可能是更好的设计选择。
分配器可能会过度分配,并且
NonNull<[u8]>
是一个包含长度信息的胖指针。
为什么是
u8
而不是()
?不确定,但它可能反映了所有内存最终都是一堆字节的想法。此外,允许悬空指向 ZST 的指针可能与此有关。