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
是一种指向堆的特殊指针,但它仍然是一个指针
知道了这一点,您就明白:
为8字节,因为Box
的大小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
=>8字节大小相同(具有64位指针宽度)*const i8
:Box
是一个DST=>基本上与[i8]
=>16字节大小相同(具有64位指针宽度)FatPtr
:框
不是一个DST。它的大小基本上与和[i8]
=>8字节相同(指针宽度为64位)*const FatPtr