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

时间:2015-06-22 11:52:14

标签: vector rust

在已声明容量的set_len上呼叫Vec是否安全?像这样:

let vec = unsafe {
    let temp = Vec::with_capacity(N);
    temp.set_len(N);
    temp
}

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

查看文档:

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

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

2 个答案:

答案 0 :(得分:4)

文档有点含糊不清。措辞可能会更好。您的代码示例与以下堆栈等效项一样“安全”:

let mut arr: [T; N] = mem::uninitialized();

这意味着只要在阅读之前写入数组元素就可以了。如果您在写作之前阅读,则打开了nasal demons的大门并且记忆力不安全。

  

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

llvm会将此优化为单个memset。

答案 1 :(得分:1)

如果“我需要我的矢量大小为N”,那么你的意思是你需要为10个元素分配内存,with_capacity已经在做了。

如果你的意思是想要一个长度为10的向量(虽然不确定为什么......),你需要用初始值初始化它。 即:

let mut temp: Vec<i32> = Vec::with_capacity(10); // allocate room in memory for 
                                            // 10 elements. The vector has 
                                            // initial capacity 10, length will be the 
                                            // number of elements you push into it
                                            // (initially 0)
v.push(1); // now length is 1, capacity still 10

VS

let mut v: Vec<i32> = vec![0; 10]; // create a vector with 10 elements
                                   // initialized to 0. You can mutate
                                   // those in place later.
                                   // At this point, length = capacity = 10

v[0] = 1; // mutating first element to 1.
          // length and capacity are both still 10