Vec,交互者的向<T>量与字符串的向量,为什么即使元素在堆上,我也可以索引/复制 int 元素?



简而言之,某些数据类型存储在堆栈上,因为编译器知道它们在运行时需要多少内存。其他数据类型更灵活,并存储在堆中。数据的指针停留在堆栈上,指向堆数据。

我的问题是,如果 Vec 数据在堆上,如何访问 i32(和其他通常的堆栈存储类型(,就好像实际在堆栈上(通过索引复制(一样。

换句话说。对我来说,我无法从 Vec 中move出字符串是有道理的,它们不实现 Copy 并且通常move.当它们是 Vec 的元素时,也会发生同样的情况。但是,i32 通常是复制的,但是为什么当它们是堆上矢量数据的一部分时也会发生这种情况?

请随时指出任何概念错误,如果您认为我错过了什么,请指出我现有的材料。我已经阅读了 Rust 编程语言并检查了一下。

fn main() {
// int in stack
let i: i32 = 1;
let _ic = i;
println!("{}", i);
// String on heap
let s: String = String::from("ciao cippina");
let _sc = &s;
println!("{}", s);
// array and data on the stack
let ari = [1, 2, 3];
println!("{:?}", &ari);
println!("a 0 {}", ari[0]);
// array and Pointers on the stack, data on the heap
let ars = [String::from("ciao"), String::from("mondo")];
println!("{:?}", &ars);
println!("a 0 {}", ars[0]);
// let _ars_1 = ars[0];  // ERROR, cannot move out of array
// Vec int, its Pointer on stack, all the rest on heap
let veci = vec![2, 4, 5, 6];
println!("{:?}", &veci);
println!("a 0 {}", veci[0]);
let _veci_1 = veci[0];  // NO ERROR HERE ??
// Vec string, its Pointer on stack, all the rest on heap
let vecs = vec![String::from("ciao"), String::from("mondo")];
println!("{:?}", &vecs);
println!("a 0 {}", vecs[0]);
// let _vecs_1 = vecs[0];  // ERROR, cannot move out of Vec
}

仅仅因为向量的元素存在于堆上并不意味着编译器无法知道元素的大小。元素所在的位置并不重要,如果类型是"可复制的",则可以从堆栈 ->堆复制它,反之亦然。

在您的情况下,i32 占用 4 个字节,无论是在堆上还是在堆栈上(忽略对齐问题(

相关内容

最新更新