我有两个静态数组,u8我会实现一个函数来连接它们。类似的东西
fn concat_u8(first: &'static [u8], second: &'static [u8]) -> &'static [u8] {
&[&first[..], &second[..]].concat()
}
Run Code Online (Sandbox Code Playgroud)
编译器向我展示了错误returns a reference to data owned by the current function。那是因为分配的内存将在函数结束时空闲。
我怎样才能“强制”生命周期是静态的?
编辑
我有一个长期运行的过程。
在开始时,进程处理一些输入以计算结果(即concat_u8 函数)。结果是一个数组,u8并且将在进程生命周期的剩余时间中以只读方式使用。concat_u8 在“内部start事件”之后无法调用该函数。
我不想使用,Box因为动态分配意味着一点开销(可能无法衡量?)并将结果存储为&[u8].
我有机会这样做吗?
我有机会在不使用unsafe块的情况下做到这一点吗?
不可能在不泄漏内存的情况下将两个切片连接到具有静态生命周期的新切片。
切片在内存中连续存储。用静态生命周期连接两个切片需要将它们复制到新分配的内存中,因为结果也需要是连续的。这个新分配的内存必然归当前函数所有,因此您不能返回对它的引用。
您必须将内存的所有权转回给调用者:
pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
[first, second].concat()
}
Run Code Online (Sandbox Code Playgroud)
不再需要要求输入具有静态生命周期,并且可能根本不需要实现这个函数,因为调用它不会比简单地内联代码更短或更清晰。