當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Rust NonNull.as_uninit_slice_mut用法及代碼示例

本文簡要介紹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-lang.org大神的英文原創作品 std::ptr::NonNull.as_uninit_slice_mut。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。