提问人:doliphin 提问时间:11/11/2023 更新时间:11/11/2023 访问量:62
为什么“Allocator.allocate”会分发“NonNull<[u8]>”...但是“deallocate”接受“NonNull<u8>”?[复制]
Why does `Allocator.allocate` hand out `NonNull<[u8]>`... but `deallocate` accepts `NonNull<u8>`? [duplicate]
问:
正如标题所说。
pub unsafe trait Allocator {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
}
两个必需的方法都采用不同的指针类型,这对我来说似乎很奇怪。为什么会做出这样的选择?Allocator
此外,为什么选择和?为什么不同时拥有 OR 两种方法呢?u8
[u8]
NonNull<()>
NonNull<[()]>
我的理解是,选择 or 是个好主意,因为它具有实际可以分配的最不严格的布局要求(因为要求为非零)。但是,我认为每次都需要一个演员表可能是一个更好的设计选择。[u8]
u8
Layout
align
答:
2赞
Ivan C
11/11/2023
#1
分配器可能会过度分配,并且是一个包含长度信息的胖指针。NonNull<[u8]>
为什么而不是 ?不确定,但它可能反映了所有内存最终都是一堆字节的想法。此外,允许指向 ZST 的指针悬空这一事实可能与此有关。u8
()
评论
0赞
doliphin
11/11/2023
关于胖指针的好点,没想到。然后也拿一个胖指针没有任何意义!deallocate
评论