本文简要介绍rust语言中 std::ptr::NonNull.as_uninit_slice_mut
的用法。
用法
pub unsafe fn as_uninit_slice_mut<'a>(&self) -> &'a mut [MaybeUninit<T>]
返回对可能未初始化的值切片的唯一引用。与 as_mut
相比,这不需要初始化值。
对于共享副本,请参阅 as_uninit_slice
。
安全性
调用此方法时,您必须确保满足以下所有条件:
-
对于
ptr.len() * mem::size_of::<T>()
多个字节的读取和写入,指针必须为 valid,并且必须正确对齐。这尤其意味着:-
该切片的整个内存范围必须包含在单个分配的对象中!切片永远不能跨越多个分配的对象。
-
即使对于零长度切片,指针也必须对齐。这样做的一个原因是枚举布局优化可能依赖于对齐的引用(包括任何长度的切片)和非空值,以将它们与其他数据区分开来。您可以使用
NonNull::dangling()
获取可用作零长度切片的data
的指针。
-
-
切片的总大小
ptr.len() * mem::size_of::<T>()
不得大于isize::MAX
。请参阅pointer::offset
的安全文档。 -
您必须强制执行 Rust 的别名规则,因为返回的生命周期
'a
是任意选择的,不一定反映数据的实际生命周期。特别是,在此生命周期内,指针指向的内存不得通过任何其他指针访问(读取或写入)。
即使此方法的结果未使用,这也适用!
另见 slice::from_raw_parts_mut
。
例子
#![feature(allocator_api, ptr_as_uninit)]
use std::alloc::{Allocator, Layout, Global};
use std::mem::MaybeUninit;
use std::ptr::NonNull;
let memory: NonNull<[u8]> = Global.allocate(Layout::new::<[u8; 32]>())?;
// This is safe as `memory` is valid for reads and writes for `memory.len()` many bytes.
// Note that calling `memory.as_mut()` is not allowed here as the content may be uninitialized.
let slice: &mut [MaybeUninit<u8>] = unsafe { memory.as_uninit_slice_mut() };
相关用法
- Rust NonNull.as_mut_ptr用法及代码示例
- Rust NonNull.as_mut用法及代码示例
- Rust NonNull.as_ptr用法及代码示例
- Rust NonNull.as_non_null_ptr用法及代码示例
- Rust NonNull.as_ref用法及代码示例
- Rust NonNull.len用法及代码示例
- Rust NonNull.slice_from_raw_parts用法及代码示例
- Rust NonNull.cast用法及代码示例
- Rust NonNull.new_unchecked用法及代码示例
- Rust NonNull.get_unchecked_mut用法及代码示例
- Rust NonNull.new用法及代码示例
- Rust NonNull.dangling用法及代码示例
- Rust NonZeroU128.checked_pow用法及代码示例
- Rust NonZeroUsize.checked_next_power_of_two用法及代码示例
- Rust NonZeroI128.saturating_pow用法及代码示例
- Rust NonZeroI64.wrapping_abs用法及代码示例
- Rust NonZeroU64.checked_mul用法及代码示例
- Rust NonZeroU16.saturating_pow用法及代码示例
- Rust NonZeroU8.checked_add用法及代码示例
- Rust NonZeroUsize.checked_pow用法及代码示例
- Rust NonZeroU8.unchecked_add用法及代码示例
- Rust NonZeroUsize.leading_zeros用法及代码示例
- Rust NonZeroI32.trailing_zeros用法及代码示例
- Rust NonZeroI8.saturating_pow用法及代码示例
- Rust NonZeroIsize.wrapping_abs用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::ptr::NonNull.as_uninit_slice_mut。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。