为什么指向堆上某些内容的指针的大小大于堆栈变量的大小?



我有以下堆栈和堆分配的变量:

let var1 = 10;
let var2 = Box::new(10);

打印这些输出相同的值,10

println!("var1 ={} var2 ={}", var1, * var2);

当我使用mem::size_of_val()检查大小时,var1是 4,var2是 8。

var2不是指向堆的指针吗?为什么指针会大于堆栈变量 (var1)?

另外,在println!()中使用"*"(即*var2)应该有什么不同吗?无论哪种方式,我都会得到 10 个。

您没有显示有关如何调用mem::size_of_val的代码,但我想从结果中您正在这样做:

println!("var1 size = {}", mem::size_of_val(&var1)); // 4
println!("var2 size = {}", mem::size_of_val(&var2)); // 8

var1的大小是i32的大小(4 个字节),而var2的大小是Box的大小,这只是一个指针(如果它是一个 trait 对象,它将是两个指针)。指针始终是usize(64 位系统上为 8 个字节)。

如果先取消引用框,则大小将是框内容的大小,您将获得预期的结果:

println!("var2 size = {}", mem::size_of_val(&*var2)); // 4

另外,在println!()中使用"*"(即*var2)应该有什么不同吗?无论哪种方式,我都会得到 10 个。

println!宏以及format!和其他一些宏将始终在值前面附加&,以确保借用、移动或复制该值。当需要该值时,它将根据需要多次自动取消引用。有关更多详细信息,请参阅此答案。

相关内容

  • 没有找到相关文章

最新更新