Pointers 为什么指向堆上某个对象的指针的大小大于堆栈变量的大小?
我有以下堆栈和堆分配变量:Pointers 为什么指向堆上某个对象的指针的大小大于堆栈变量的大小?,pointers,reference,rust,smart-pointers,memory-layout,Pointers,Reference,Rust,Smart Pointers,Memory Layout,我有以下堆栈和堆分配变量: let var1 = 10; let var2 = Box::new(10); 打印这些输出相同的值,10: println!("var1 ={} var2 ={}", var1, * var2); 当我使用mem::size\u of_val()检查大小时,var1为4,var2为8 var2不是指向堆的指针吗?为什么指针会大于堆栈变量(var1) 另外,是在println!中使用“*”(即*var2)!()应该做什么不同的事情?无论哪种方法,我都得到10。您没
let var1 = 10;
let var2 = Box::new(10);
打印这些输出相同的值,10
:
println!("var1 ={} var2 ={}", var1, * var2);
当我使用mem::size\u of_val()
检查大小时,var1
为4,var2
为8
var2
不是指向堆的指针吗?为什么指针会大于堆栈变量(var1
)
另外,是在
println!中使用“*
”(即*var2
)!()
应该做什么不同的事情?无论哪种方法,我都得到10。您没有显示如何调用mem::size\u 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代码>宏,以及格式
和其他一些函数总是将&
前置到一个值,以确保它是借用的,而不是移动或复制的。当需要该值时,它将根据需要自动取消引用多次。有关更多详细信息,请参阅