7.1.2 MaybeUninit::zeroed() 方法

02-MaybeUninit::zeroed() 方法 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.html

7.1.2 MaybeUninit::zeroed() 方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::mem::{MaybeUninit, transmute};

fn main() {
    let mut x = [const { MaybeUninit::<u32>::zeroed() }; 10];

    x[6].write(7);

    // SAFETY: `x` 的所有元素都已写入
    let x: [u32; 10] = unsafe { transmute(x) };
    println!("{x:?}")
}

「MaybeUninit<T>::zeroed() 是 MaybeUninit<T>::uninit() 的另一种构造函数。它指示编译器用零填充 T 的位。」

问:「尽管内存已被写入,类型仍是 MaybeUninit<T>。谁能想到原因?」

答:某些类型要求其值非零或非空。典型例子是引用,但这也适用于许多其他类型。考虑 NonZeroUsize 整数类型及其同族中的其他类型。

最后修改 August 11, 2026: 更新 (70a5af133)