如何在 Rust 中连接静态切片?

2023-11-27

我有两个静态切片u8我会实现一个函数来连接它们。类似的东西

fn concat_u8(first: &'static [u8], second: &'static [u8]) -> &'static [u8] {
    &[&first[..], &second[..]].concat()
}

编译器向我显示错误returns a reference to data owned by the current function。这是因为分配的内存将在函数结束时释放。

我怎样才能“强制”生命周期静态?

Edit

我有一个长期运行的过程。

在开始时,该过程处理一些输入以计算结果(即concat_u8功能)。结果是一个切片u8并将在进程生命周期的剩余时间内以只读方式使用。 功能concat_u8无法在“内部”之后调用start event".

我不想使用Box因为动态分配意味着一点开销(可能无法测量?)并将结果存储为&[u8].

我有机会这样做吗?

我有机会在不使用unsafe block?


不可能在不泄漏内存的情况下将两个切片连接到具有静态生存期的新切片。

切片连续存储在内存中。连接具有静态生命周期的两个切片需要将它们复制到新分配的内存,因为结果也需要是连续的。这个新分配的内存必然由当前函数拥有,因此您无法返回对其的引用。

您必须将内存的所有权转移回调用者:

pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
    [first, second].concat()
}

不再需要要求输入具有静态生命周期,并且可能根本不需要实现此函数,因为调用它不会比简单内联代码更短或更清晰。

如上所述,如果您需要&'static [u8]代替Vec<u8>由于某种原因,你可以leak()向量。很少有理由这样做,并且访问静态切片并不比访问向量快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rust 中连接静态切片? 的相关文章

随机推荐