我正在看代码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位结构.这种不同大小的类型的转换是如何工作的?
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的指针- 在对象上调用特征方法所需的信息,因为它的具体类型是未知的.| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |