如何将任意长度的 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
中的数据更快。事实上,如果它慢,我不会感到惊讶,因为你正在复制它。
我目前正在处理向量,并试图确保我在堆栈上拥有本质上是我的向量数组的内容。我无法调用 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 myVec
当然可以。
Vec
[...] seems to stride over pointers on the heap, dereferencing at each entry
访问 Vec
中的每个成员需要内存取消引用。访问数组中的每个成员都需要内存取消引用。这里没有 material 速度差异。
for fast access
我怀疑这会比直接访问 Vec
中的数据更快。事实上,如果它慢,我不会感到惊讶,因为你正在复制它。