百度上搜索到的内容说得不太明白。
说box上指向的数据在堆,so what?
box被清掉的时候也会自动清掉指向的数据,那又如何?这个数据放在栈上不一样么?我才不在乎你在堆还是栈。除非有什么场境必须用box才能解决问题,没它不行。
百度上搜索到的内容说得不太明白。
说box上指向的数据在堆,so what?
box被清掉的时候也会自动清掉指向的数据,那又如何?这个数据放在栈上不一样么?我才不在乎你在堆还是栈。除非有什么场境必须用box才能解决问题,没它不行。
这并不是属于 Rust 的问题,当你使用 C/C++/Rust 这类语言进行开发时,你当然应该在乎你的数据是在堆上还是在栈上,否则你不可能成为成熟的工程师,尤其是嵌入式开发这种相对底层且资源受限的场景。
Box 是 Rust 使用堆的一种方式,而 C++ 是 new,C 是 malloc。使用它们的原因基本是一致的:
我没有写过rust,不过我觉得:
栈上的内存在编译时必须确定大小, 其长度是不可变的, 堆上的内存是长度可以变的.
为了满足在运行时对某个对象修改的需要, 这时候就需要放在堆上. 同时在栈中存放这个数据的引用.
引用实际上就是指针, 而指针的长度是固定的, 通常为一个字(word)的大小, 在 Rust 为一个 usize
大小, usize 在 32 位系统是 4 字节, 在 64 位系统是 8 字节. 因此满足了编译要求, 同时又支持可变长度数据的修改.
比如一个 Vec<User>
存放在线用户列表, 在运行时往里面增加或删除元素, 这时候就不可能放在栈上. Vec 本身实际就是存放在堆中, Box 一般用于结构体修改时, 结构体的数据长度发生变化的情况 例如:
#[allow(unused)]
#[derive(Debug)]
struct User {
id: u32,
name: String
}
fn main() {
let mut u = User {
id: 1,
name: "test".to_string()
};
println!("user info: {:?}", u);
u.name = "changed".to_string();
println!("user info: {:?}", u);
}
7 回答5.3k 阅读
1 回答3.4k 阅读
2 回答903 阅读
1 回答868 阅读
如果从 C 语言的角度来解释,
int
数组(栈)和int
指针(堆)有什么差别呢,就在于int
数组会在当前作用域结束时自动释放,而int
指针是手动控制的。那好,回到 Rust 角度,好像没有这个问题,完全可以返回数组了,可是有没有发现的是,Rust 当中的数组长度只能是常量,这是绝对固定的,这样才能方便管理栈内存。不能固定的统一使用
Vec
。在 Rust 当中存在一个说法:当你理解如何在 Rust 当中编写链表后,才能算入门成功。
如果去掉
<Box>
,编译器也会给出说明:也就是说:所有不能在编译时确定空间大小的数据,全部都要放置到堆区。
个人理解简单理解,也不太成熟,不过这是堆与栈空间管理通识,可以尝试看看相关介绍:堆和栈的区别。