为什么 `Allocator.allocate` 分发 `NonNull<[u8]>`...但 `deallocate` 接受 `NonNull<u8>`?

问题描述 投票:0回答:1

正如标题所说。

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
非零)。但是,我认为每次都需要演员表可能是更好的设计选择。

rust std allocation alloc
1个回答
0
投票

分配器可能会过度分配,并且

NonNull<[u8]>
是一个包含长度信息的胖指针。

为什么是

u8
而不是
()
?不确定,但它可能反映了所有内存最终都是一堆字节的想法。此外,允许悬空指向 ZST 的指针可能与此有关。

© www.soinside.com 2019 - 2024. All rights reserved.