作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在调查 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
的大小或可以对 borrowck 隐藏其内部结构的类型(如示例中的 Leaked<T>
),这是完全可行的。
最佳答案
可以使用 nodrop ,但它可能会泄漏。
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 : NoDrop<GenericArray<T, N>> = NoDrop::new(std::mem::uninitialized());
let i = list.into_iter();
for r in res.iter_mut() {
// this could panic anytime
std::ptr::write(r, f(i.next().unwrap()))
}
res.into_inner()
}
}
让我们假设在第一项 (a
) 从 i
被消费并写入 r
之后,发生了 panic 。 i
中的剩余项目将被丢弃,但项目 a
不会。虽然内存泄漏 is not被认为是不安全的,这是不可取的。
关于memory-leaks - 有没有办法预先泄漏和取消泄漏值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919842/
我是一名优秀的程序员,十分优秀!