from_raw_parts_mut如何在不同大小的类型之间进行转换?

cha*_*ika 2 rust

我正在看代码from_raw_parts_mut:

pub unsafe fn from_raw_parts_mut<'a, T>(p: *mut T, len: usize) -> &'a mut [T] {
    mem::transmute(Repr { data: p, len: len })
}
Run Code Online (Sandbox Code Playgroud)

它用于transmute将a重新解释Repr为a &mut [T].据我所知,Repr是一个128位结构.这种不同大小的类型的转换是如何工作的?

Chr*_*son 5

mem::transmute()仅在转换为相同大小的类型时才起作用 - 这意味着&mut[T]切片的大小也相同.

Repr:

#[repr(C)]
struct Repr<T> {
    pub data: *const T,
    pub len: usize,
}
Run Code Online (Sandbox Code Playgroud)

它有一个指向某些数据和长度的指针.这正是一个切片 - 一个指向项目数组的指针(可能是一个实际数组,或由a Vec<T>等拥有),其长度可以说明有多少项是有效的.

作为切片传递的对象(在封面下)正是它的Repr外观,即使它引用的数据可以是从0到T适合内存的任何数量.

在Rust中,一些引用不仅仅像其他语言一样实现为指针.有些类型是"胖指针".这一开始可能并不明显,特别是如果你熟悉其他语言的参考/指针!一些例子是:

  • 如上所述,切片&[T]&mut [T]实际上是指针和长度.边界检查需要长度.例如,您可以传递与数组的一部分对应的切片或Vec函数.
  • 特征对象喜欢&Trait或者Box<Trait>,其中Trait是特征而不是具体类型,实际上是指向具体类型的指针和指向vtable的指针- 在对象上调用特征方法所需的信息,因为它的具体类型是未知的.