当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust NonNull.as_uninit_slice_mut用法及代码示例


本文简要介绍rust语言中 core::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大神的英文原创作品 core::ptr::NonNull.as_uninit_slice_mut。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。