我目前正在研究doing more stuff with arrays,但我認爲如果我們被允許以某種方式轉變爲陣列的前置陣列,那麼這些操作的性能可能會更好,只是爲了在函數結束時不泄漏它。這將讓我們使用泄漏放大而不a)引入不安全並且b)設置catch_panic(_)
。 Rust在某種程度上可能嗎?有沒有辦法預先泄漏一個值?
例如,創建從一個迭代的通用陣列(這顯然是行不通的):
#[inline]
fn map_inner<I, S, F, T, N>(list: I, f: F) -> GenericArray<T, N>
where I: IntoIterator<Item=S>, F: Fn(&S) -> T, N: ArrayLength<T> {
unsafe {
// pre-leak the whole array, it's uninitialized anyway
let mut res : GenericArray<Leaked<T>, N> = std::mem::uninitialized();
let i = list.into_iter();
for r in res.iter_mut() {
// this could panic anytime
std::ptr::write(r, Leaked::new(f(i.next().unwrap())))
}
// transmuting un-leaks the array
std::mem::transmute::<GenericArray<Leaked<T>, N>,
GenericArray<T, N>>(res)
}
}
我要指出,如果我們要麼不得不編譯時獲得的T
大小或類型可以隱藏它的內部(例如Leaked<T>
),這是完全可行的。
您期待的性能提升有哪些?不增加'len'? – malbarbo
如果我試圖通過捕捉恐慌來防止泄漏(目前只能在beta/nightly上運行),那麼吞吐量比收集「Vec」的吞吐量高出約45%。我認爲我可以通過預先泄漏獲得更好的結果。 – llogiq