gpt4 book ai didi

memory-leaks - 有没有办法预先泄漏和取消泄漏值?

转载 作者:行者123 更新时间:2023-11-29 07:51:26 25 4
gpt4 key购买 nike

我目前正在调查 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被认为是不安全的,这是不可取的。

我认为问题链接中描述的方法是可行的方法。它类似于 VecArrayVec实现。我正在编写的数组库中使用类似的方法。

关于memory-leaks - 有没有办法预先泄漏和取消泄漏值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com