在已声明容量的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]
带来的克隆。
答案 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