如何在 Rust 中使用运行时已知的切片分配切片?

use*_*300 1 slice dynamic-memory-allocation rust

我看到回复告诉你使用Vec::with_capacity(some_size);,但感觉很奇怪。

为什么需要使用 Vector 来获取切片?我不想稍后增加切片,我只想使用普通切片,但大小在运行时是已知的,因为它来自某些程序输入。

我当前的解决方案是:

   let mutable_zeroed_slice: &mut [u8] = &mut vec![0; size][..];
Run Code Online (Sandbox Code Playgroud)

有没有更好、更惯用且不费解的?

更新:您不能在包装在函数中之前使用该技巧,因为返回时您将丢失切片引用。

更新2:正如第一个回复中所指出的,Vec::with_capacity(size)[..]将为您提供一个具有给定容量的不可变空切片,这不是很有用。

pro*_*-fh 5

您不需要可增长的属性,但仍然需要分配存储空间。

&[u8]指的是分配在某处的一些数据;您Vec尝试在此处创建的内容将在函数末尾消失,然后引用其内容的任何切片都将悬空,而 Rust 会阻止您这样做。

这个想法是使用装箱切片:它被装箱以便分配存储,但它不可增长(就像向量一样)。实现此目的的一个简单方法是构建一个向量,然后窃取其内容。

请注意,您似乎混淆了容量大小/长度

fn new_byte_slice(size: usize) -> Box<[u8]> {
    vec![0; size].into_boxed_slice()
}

fn main() {
    let values = new_byte_slice(10);
    println!("{:?}", values);
}
/*
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
*/
Run Code Online (Sandbox Code Playgroud)

  • @user1098300但是“let slice: &amp;[u8] = allocate_slice(5)”如何可能(无论“allocate_slice()”做什么,静态存储除外)?类型“&amp;[T]”是*非拥有*。 (2认同)
  • @user1098300 这个假设的 `Slice&lt;T&gt;` 只是拼写为 `Box&lt;[T]&gt;`。这正是您想要的。“Box&lt;U&gt;”是分配在堆上的拥有的“U”;`Box&lt;[T]&gt;` 是在堆上分配的一个拥有的切片,并且正如您所期望的那样,切片知道它的大小。我想问题来自于我们倾向于在这两种情况下将 `[T]` 和 `&amp;[T]` 命名为*切片*,这是相当模糊的...... (2认同)