为什么指向堆上某物的指针的大小大于堆栈变量的大小?
Why is the size of a pointer to something on the heap larger than the size of a stack variable?
我有以下堆栈和堆分配的变量:
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
的大小,即只是一个指针(如果它是一个特征对象,它将是两个指针)。指针始终是 usize
(在 64 位系统上为 8 个字节)。
如果您首先取消引用该框,那么大小将是该框内容的大小,您将得到您期望的结果:
println!("var2 size = {}", mem::size_of_val(&*var2)); // 4
Also, is the use of "*
" (i.e., *var2
) in the println!()
supposed to do anything different? I get 10 either way.
println!
宏以及 format!
和其他一些宏,将始终在值前加上 &
以确保它是借用的,而不是移动或复制的。当需要该值时,它会根据需要自动取消引用多次。有关详细信息,请参阅 。
我有以下堆栈和堆分配的变量:
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
的大小,即只是一个指针(如果它是一个特征对象,它将是两个指针)。指针始终是 usize
(在 64 位系统上为 8 个字节)。
如果您首先取消引用该框,那么大小将是该框内容的大小,您将得到您期望的结果:
println!("var2 size = {}", mem::size_of_val(&*var2)); // 4
Also, is the use of "
*
" (i.e.,*var2
) in theprintln!()
supposed to do anything different? I get 10 either way.
println!
宏以及 format!
和其他一些宏,将始终在值前加上 &
以确保它是借用的,而不是移动或复制的。当需要该值时,它会根据需要自动取消引用多次。有关详细信息,请参阅