私は現在doing more stuff with arraysを探していますが、何らかの形で配列が先頭に配列されていて、関数が終了したときにそれをun-leakすることが許可されていれば、その操作のパフォーマンスはさらに良くなると思います。これは、a)不安全性を導入し、b)catch_panic(_)
を設定することなく、漏出増幅を使用させる。これは何とかRustで可能ですか?例えば値をプリ&リークする方法はありますか?
、反復子(これは明らかに動作しません)から、一般的な配列の作成:私たちのどちらかがT
のサイズや種類にアクセスする時にコンパイルがあった場合に注意すべきである
#[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)
}
}
をこの例ではLeaked<T>
のように内部を隠すことができますが、これは完全に実行可能です。
期待どおりのパフォーマンス向上はありますか? 'len'をインクリメントしませんか? – malbarbo
パニックをキャッチすることで漏れを防止しようとすると(これはベータ/ナイトリックでのみ動作します)、Vecに収集するよりもスループットが約45%向上します。私は前漏れによってさらに良い結果を得ることができると推測します。 – llogiq