作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 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
。那是因为分配的内存将在函数结束时释放。
如何“强制”生命周期为静态?
编辑
我有一个长时间运行的过程。
在开始时,流程会处理一些输入以计算结果(即 concat_u8
函数)。结果是 u8
的一个片段,将以只读方式在剩余的进程生命周期中使用。在“内部 start
事件”之后无法调用函数 concat_u8
。
我不想使用 Box
,因为动态分配意味着一些开销(可能无法测量?)并将结果存储为 &[u8]
。
我有机会这样做吗?
如果不使用 unsafe
block ,我有机会做到这一点吗?
最佳答案
不可能在不泄漏内存的情况下将两个切片连接成具有静态生命周期的新切片。
切片连续存储在内存中。连接两个具有静态生命周期的切片需要将它们复制到新分配的内存中,因为结果也需要是连续的。这个新分配的内存必然归当前函数所有,因此您不能返回对它的引用。
您必须将内存的所有权转移回调用者:
pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
[first, second].concat()
}
不再需要输入具有静态生命周期,并且可能根本不需要实现此函数,因为调用它不会比简单地内联代码更短或更清晰。
如上所述,如果您需要 &'static [u8]
而不是 Vec<u8>
出于某种原因,您可以 leak()
向量。很少有理由这样做,访问静态切片并不比访问向量快。
关于rust - 如何在 Rust 中连接静态切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893216/
我是一名优秀的程序员,十分优秀!