我有一个在堆栈上分配向量的函数。这段代码不起作用:
fn my_func(n: i32) {
let mut v = Vec::with_capacity(n);
}
编译器说
n
需要是usize
类型。从类型安全的角度来看,这似乎很合理,但我需要在其他需要i32
类型的计算中使用n
。应该如何正确处理?我有一个在堆栈上分配向量的函数。这段代码不起作用:
fn my_func(n: i32) {
let mut v = Vec::with_capacity(n);
}
n
需要是usize
类型。从类型安全的角度来看,这似乎很合理,但我需要在其他需要i32
类型的计算中使用n
。应该如何正确处理?let n: i32 = 4;
let v = Vec::<i16>::with_capacity(n as usize);
i32
重构为usize
并不是惯用的方法。据我所知,建议尽可能少地使用指针大小的整数类型,因此将其转换为usize
是惯用的方法。但如果你要从定长类型进行转换,需要添加一个检查以确保该数字确实为正数。 - Vladimir Matveev-4
强制转换为usize
会得到一个很大的正数,但这并不符合Rust定义“不安全”的非常具体的标准(这是关于内存安全的声明)。 - BurntSushi5
Vec
结构体(包含三个指针/usize
)将位于堆栈上,但n * sizeof::<T>
缓冲区始终位于堆上。 - user395760