如何使用 i32 调用 Vec::with_capacity 函数?

5

我有一个在堆栈上分配向量的函数。这段代码不起作用:

fn my_func(n: i32) {
    let mut v = Vec::with_capacity(n);
}

编译器说n需要是usize类型。从类型安全的角度来看,这似乎很合理,但我需要在其他需要i32类型的计算中使用n。应该如何正确处理?

1
FYI:Vec 结构体(包含三个指针/usize)将位于堆栈上,但 n * sizeof::<T> 缓冲区始终位于堆上。 - user395760
1个回答

8

那个可行,谢谢。在这种情况下,这种方法被认为是规范的吗? - anderspitman
2
最好的方法是如果可能的话将'i32'重构为'usize'。否则,我认为这是你唯一的选择。在Rust中进行类型转换是不安全的,因此'i32'中的'-4'将变成一个很大的正数'usize',因此您可能需要对值进行一些测试,但是这种开销取决于您的情况可能是不必要的。 - DrYap
1
您可以随时使用Numcast:http://doc.rust-lang.org/std/num/trait.NumCast.html#tymethod.from - oli_obk
至少我可以将它设为“u32”,这应该解决大多数问题。 - anderspitman
3
我相信将i32重构为usize并不是惯用的方法。据我所知,建议尽可能少地使用指针大小的整数类型,因此将其转换为usize是惯用的方法。但如果你要从定长类型进行转换,需要添加一个检查以确保该数字确实为正数。 - Vladimir Matveev
3
@DrYap 有一个小问题:在Rust中进行类型转换是安全的。虽然将-4强制转换为usize会得到一个很大的正数,但这并不符合Rust定义“不安全”的非常具体的标准(这是关于内存安全的声明)。 - BurntSushi5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接