【发布时间】:2016-04-28 15:59:46
【问题描述】:
我目前正在研究doing more stuff with arrays,但我认为如果我们被允许以某种方式预先转换为Leaked<T> 数组,那么这些操作的性能可能会更好,只是在功能结束。这将让我们使用泄漏放大,而不会 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? -
如果我试图通过捕捉恐慌来防止泄漏(目前它只适用于 beta/nightly),我得到的吞吐量比收集到
Vec的吞吐量高出大约 45%。我想我可以通过预泄漏获得更好的结果。
标签: memory-leaks rust