gpt4 book ai didi

rust - 为什么将 `ptr::write` 与 `MaybeUninit` 的数组一起使用?

转载 作者:行者123 更新时间:2023-11-29 07:43:25 26 4
gpt4 key购买 nike

在标准库中,documentation显示如何实例化数组MaybeUninit:

let arr: [MaybeUninit<T>; N] =
MaybeUninit::uninit().assume_init();

我们知道这是安全的,因为 MaybeUninit 的契约允许未初始化的值。接下来我们被要求使用 ptr::write(value) 来初始化每个元素。但这又需要 unsafe 代码。我们还知道覆盖 MaybeUninit 是安全的,因为它不会删除任何东西。那么为什么不像 arr[i] = MaybeUninit::new(value) 那样覆盖它呢?

最佳答案

let arr: [MaybeUninit<T>; N] = MaybeUninit::uninit().assume_init();只是一个捷径。

arr[i] = MaybeUninit::new(value) ,在你的例子中 arr[i]MaybeUninit所以你的问题只是关于使用什么样式来改变向量。你也可以做 arr[i].write(value)这在实践中并没有真正改变,但每晚都需要说明为什么文档不使用它。但你是对的arr[i] = MaybeUninit::new(value)也允许在没有不安全关键字的情况下覆盖该值,这是一个完美定义的行为

你忘记的是 MaybeUninit在 Rust 中不是真的使用,除非在极少数情况下,Rust 不需要它。我们主要在处理 ffi 时使用它,所以这个例子并不是真正的单词用例。所以它看起来很奇怪。在这里,作者可能想模拟一个真实的案例,其中数组将通过使用原始指针在 Rust 之外初始化。

关于rust - 为什么将 `ptr::write` 与 `MaybeUninit` 的数组一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com