如何将任意长度的 Vec<T> 的所有条目加载到堆栈中?

How can I load all entries of a Vec<T> of arbitrary length onto the stack?

我目前正在处理向量,并试图确保我在堆栈上拥有本质上是我的向量数组的内容。我无法调用 Vec::into_boxed_slice,因为我正在 Vec 中动态分配 space。这完全可能吗?

已阅读 how to implement Vec, it seems to stride over pointers on the heap, dereferencing at each entry 上的 Rustonomicon。我想将堆中的 Vec 个条目分块到堆栈中以便快速访问。

您可以在 nightly Rust 中使用 unsized_locals 功能:

#![feature(unsized_locals)]

fn example<T>(v: Vec<T>) {
    let s: [T] = *v.into_boxed_slice();
    dbg!(std::mem::size_of_val(&s));
}

fn main() {
    let x = vec![42; 100];
    example(x); // Prints 400
}

另请参阅:

  • How to get a slice as an array in Rust?

I cannot call Vec::into_boxed_slice since I am dynamically allocating space in my Vec

当然可以。

Vec [...] seems to stride over pointers on the heap, dereferencing at each entry

访问 Vec 中的每个成员需要内存取消引用。访问数组中的每个成员都需要内存取消引用。这里没有 material 速度差异。

for fast access

我怀疑这会比直接访问 Vec 中的数据更快。事实上,如果它,我不会感到惊讶,因为你正在复制它。