【问题标题】:Why is the size of a pointer to something on the heap larger than the size of a stack variable?为什么指向堆上某物的指针的大小大于堆栈变量的大小?
【发布时间】:2017-02-21 03:57:39
【问题描述】:

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

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 个。

【问题讨论】:

    标签: pointers reference rust smart-pointers memory-layout


    【解决方案1】:

    您没有显示您如何调用 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
    

    另外,在println!() 中使用“*”(即*var2)是否应该做任何不同的事情?无论哪种方式,我都得到 10 个。

    println! 宏以及format! 和其他一些宏总是会在值前面加上&,以确保它是借用的,而不是移动或复制的。当需要该值时,它将根据需要自动取消引用多次。详情请参阅this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2018-04-14
      • 2011-03-22
      • 2012-08-13
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多