< 返回版块

Zhanghailin1995 发表于 2021-05-15 21:44

Tags:切片,slice,DST

&[T] 和 Box<[T]>的使用场景有什么区别,平常在使用的时候似乎大部分情况都是&[T]?有没有大佬给解惑

评论区

写评论
Bai-Jinlin 2021-05-17 18:15

这个最简单的例子就是

let a=[1,2,3];
let b:&[i32]=&a;

这些行为还可以用Unsize和CoerceUnsized来表达,这些具体在nomicon的4.1节有讲,我写了一段代码共你参考。

https://play.rust-lang.org/?version=nightly&edition=2018&gist=3084775bb4595eaa2107f2e29814165d

--
👇
Zhanghailin1995: 感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子

--
👇
Bai-Jinlin: &[T]代指的是一块有着确定大小的连续内存空间。

from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]

可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造

let s: Box<[i32]> = Box::new([10, 40, 30]);

对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。

作者 Zhanghailin1995 2021-05-17 14:05

感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子

--
👇
Bai-Jinlin: &[T]代指的是一块有着确定大小的连续内存空间。

from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]

可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造

let s: Box<[i32]> = Box::new([10, 40, 30]);

对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。

yct21 2021-05-17 09:26

Box 有所有权的

Bai-Jinlin 2021-05-16 11:43

&[T]代指的是一块有着确定大小的连续内存空间。

from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]

可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造

let s: Box<[i32]> = Box::new([10, 40, 30]);

对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。

1 共 4 条评论, 1 页