本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。