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

时间:2017-04-07 13:13:14

标签: rust

我正在查看from_raw_parts_mut的代码:

transmute

它使用Repr&mut [T]重新解释为Repr。据我所知,> packageVersion("readtext") [1] ‘0.3’ ?readtext::readtext readtext(file, ignore_missing_files = FALSE, textfield = NULL, docvarsfrom = c("metadata", "filenames", "filepaths"), dvsep = "_", docvarnames = NULL, encoding = NULL, verbosity = getOption("readtext_verbosity"), ...) 是一个128位结构。这种不同大小的类型的转换是如何工作的?

1 个答案:

答案 0 :(得分:5)

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

查看Repr

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

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

作为切片传递的对象(在封面下)正是Repr的样子,即使它所引用的数据可以是0到T之间的任何数据。将适合记忆。

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

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