具有预定义容量的 Vec 上 set_len 操作的安全性

Dan*_*ath 3 vector rust

它是安全地调用set_lenVec已宣布的能力?像这样:

let vec = unsafe {
    let temp = Vec::with_capacity(N);
    temp.set_len(N);
    temp
}
Run Code Online (Sandbox Code Playgroud)

在添加任何元素之前,我需要我的 Vector 大小为 N。

查看文档:

我有点困惑。文档说这with_capacity不会改变长度,并set_len说调用者必须确保向量具有适当的长度。那么这样安全吗?

我需要这个的原因是因为我正在寻找一种方法来声明&mut [T]大小为 N的可变缓冲区 ( ) 并且Vec似乎最适合该法案。我只是想避免让我的类型实现vec![0;n]会带来的克隆。

oli*_*obk 5

文档只是有点模棱两可。措辞可以更好。您的代码示例与以下堆栈等效项一样“安全”:

let mut arr: [T; N] = mem::uninitialized();
Run Code Online (Sandbox Code Playgroud)

这意味着只要您在读取数组元素之前写入它就可以了。如果你在写作之前阅读,你就会打开通往鼻腔恶魔和记忆不安全的大门。

我只是想避免 vec![0;n] 带来的克隆。

llvm 会将其优化为单个 memset。