pub unsafe trait GenericAlloc {
Show 14 methods
// Required methods
unsafe fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>>;
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout);
unsafe fn init<T>(&self, val: T) -> Result<NonNull<T>>;
unsafe fn alloc_then<T, F>(&self, f: F) -> Result<NonNull<T>>
where F: FnOnce() -> Result<T>;
unsafe fn init_slice<T: Clone>(
&self,
len: usize,
val: T,
) -> Result<NonNull<[T]>>;
unsafe fn alloc_slice_then<T, F>(
&self,
len: usize,
f: F,
) -> Result<NonNull<[T]>>
where F: FnMut(usize) -> Result<T>;
unsafe fn zeroed<T>(&self) -> Result<NonNull<MaybeUninit<T>>>;
unsafe fn zeroed_slice<T>(
&self,
len: usize,
) -> Result<NonNull<[MaybeUninit<T>]>>;
unsafe fn uninit<T>(&self) -> Result<NonNull<MaybeUninit<T>>>;
unsafe fn uninit_slice<T>(
&self,
len: usize,
) -> Result<NonNull<[MaybeUninit<T>]>>;
unsafe fn release<T>(&self, ptr: NonNull<T>);
unsafe fn release_with<T: ?Sized>(&self, ptr: NonNull<T>, layout: Layout);
unsafe fn release_slice<T>(&self, ptr: NonNull<[T]>);
unsafe fn release_slice_with<T>(&self, ptr: NonNull<[T]>, layout: Layout);
}
Expand description
§Safety
提供常见的和具体类型相关的内存分配操作接口.
Required Methods§
Sourceunsafe fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>>
unsafe fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>>
§Safety
用户保证分配的内存生命周期一定小于self
Sourceunsafe fn alloc_then<T, F>(&self, f: F) -> Result<NonNull<T>>
unsafe fn alloc_then<T, F>(&self, f: F) -> Result<NonNull<T>>
§Safety
用户保证分配的内存生命周期一定小于self 通过函数初始化目的是在内存池场景下可以控制多个内嵌对象分配的内存顺序 如果T内部成员也需要从同一个内存池分配内存,那么init_then可以保证先分配T,再分配成员 而init接口一定是先分配成员,再分配T,两种分配方式在不同场景下的访问顺序可能对性能有一定影响.
Sourceunsafe fn init_slice<T: Clone>(
&self,
len: usize,
val: T,
) -> Result<NonNull<[T]>>
unsafe fn init_slice<T: Clone>( &self, len: usize, val: T, ) -> Result<NonNull<[T]>>
§Safety
用户保证分配的内存生命周期一定小于self
Sourceunsafe fn alloc_slice_then<T, F>(
&self,
len: usize,
f: F,
) -> Result<NonNull<[T]>>
unsafe fn alloc_slice_then<T, F>( &self, len: usize, f: F, ) -> Result<NonNull<[T]>>
§Safety
用户保证分配的内存生命周期一定小于self
Sourceunsafe fn zeroed_slice<T>(
&self,
len: usize,
) -> Result<NonNull<[MaybeUninit<T>]>>
unsafe fn zeroed_slice<T>( &self, len: usize, ) -> Result<NonNull<[MaybeUninit<T>]>>
§Safety
用户保证分配的内存生命周期一定小于self
Sourceunsafe fn uninit_slice<T>(
&self,
len: usize,
) -> Result<NonNull<[MaybeUninit<T>]>>
unsafe fn uninit_slice<T>( &self, len: usize, ) -> Result<NonNull<[MaybeUninit<T>]>>
§Safety
用户保证分配的内存生命周期一定小于self
Sourceunsafe fn release<T>(&self, ptr: NonNull<T>)
unsafe fn release<T>(&self, ptr: NonNull<T>)
§Safety
ptr必须是allocate分配的内存, 基于类型获取的Layout和分配时保持一致
Sourceunsafe fn release_with<T: ?Sized>(&self, ptr: NonNull<T>, layout: Layout)
unsafe fn release_with<T: ?Sized>(&self, ptr: NonNull<T>, layout: Layout)
§Safety
ptr必须是allocate分配的内存, Layout和分配时保持一致
Sourceunsafe fn release_slice<T>(&self, ptr: NonNull<[T]>)
unsafe fn release_slice<T>(&self, ptr: NonNull<[T]>)
§Safety
ptr必须是allocate分配的内存, 基于类型获取的Layout和分配时保持一致
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.