Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么Box<;[T] >;内存中需要16个字节,但引用的片只需要8个字节?(在x64机器上)_Rust - Fatal编程技术网

Rust 为什么Box<;[T] >;内存中需要16个字节,但引用的片只需要8个字节?(在x64机器上)

Rust 为什么Box<;[T] >;内存中需要16个字节,但引用的片只需要8个字节?(在x64机器上),rust,Rust,考虑: fn main(){ //打印8,8,16 普林顿( "{}, {}, {}", std::mem::size_of:(), std::mem::size_of:(), std::mem::size_of:(), ); } 为什么拥有的片需要16个字节,而引用的片只需要8个字节?引用的大小取决于引用类型的“大小”: 对大小类型的引用是指向内存地址的单个指针 对未调整大小类型的引用是指向内存的指针和指向的数据的大小。这就是所谓的: #[repr(C)] 结构FatPtr{ 数据:*常数

考虑:

fn main(){
//打印8,8,16
普林顿(
"{}, {}, {}",
std::mem::size_of:(),
std::mem::size_of:(),
std::mem::size_of:(),
);
}

为什么拥有的片需要16个字节,而引用的片只需要8个字节?

引用的大小取决于引用类型的“大小”:

  • 对大小类型的引用是指向内存地址的单个指针
  • 对未调整大小类型的引用是指向内存的指针和指向的数据的大小。这就是所谓的:

    #[repr(C)]
    结构FatPtr{
    数据:*常数T,
    len:使用,
    }
    
Box
是一种指向堆的特殊指针,但它仍然是一个指针

知道了这一点,您就明白:

  • Box
    为8字节,因为
    i8
    的大小
  • 为8字节,因为引用的大小
  • 为16字节,因为切片大小不确定
  • Box
    基本上是
    *const T
    (实际上它是围绕
    Unique
    的一个新类型,它本身是一个带有
    幻影数据的
    非空
    (for),但为了简单起见,让我们坚持使用
    *const T

    锈迹中的指针通常与以下值的大小相同:()
    ,除非
    T
    是(DST)。目前,
    的大小为
    2*size\u:()
    (在编写本文时,精确表示并不稳定)。指向DST的指针称为
    FatPtr

    目前,有两种DST:切片和性状。切片的
    FatPtr
    定义如下:

    #[repr(C)]
    struct FatPtr<T> {
        data: *const T,
        len: usize,
    }
    
    #[repr(C)]
    结构FatPtr{
    数据:*常数T,
    len:使用,
    }
    
    注意:对于特征指针,
    len
    将替换为指向
    vtable
    的指针

    有了这些信息,您的问题可以得到回答:

    • Box
      i8
      是一种大小类型=>基本上与
      *const i8
      =>8字节大小相同(具有64位指针宽度)
    • Box
      [i8]
      是一个DST=>基本上与
      FatPtr
      =>16字节大小相同(具有64位指针宽度)
    • 和[i8]
      不是一个DST。它的大小基本上与
      *const FatPtr
      =>8字节相同(指针宽度为64位)
    操场:之前的讨论: