我如何使用 sysinfo crate 消除这个(看似)不必要的 clone() 调用?

How can I eliminate this (seemingly) unnecessary clone() call using the sysinfo crate?

我正在一起使用 lazy-init and sysinfo 个板条箱。获取有关进程的信息非常昂贵,所以我想我会把它隐藏在 Lazy<T> 后面,实际上是 Lazy<Process>。所以我有一些结构 - 只关注相关位:

pub struct ProgramInfo {
    process: Lazy<Process>
}

和获取 Process:

的函数
impl ProgramInfo {
    pub fn process(&self) -> &Process {
        self.process.get_or_create(|| {
            let system = System::new();
            let pid = sysinfo::get_current_pid();
            let ref_to_process = system.get_process(pid).unwrap();
            ref_to_process.clone()
    })
}

我添加了 clone() 来让它编译,但它让我很困扰,因为它似乎没有必要。正在制作 Process 结构的第二个副本,以便可以将其移动到 ProgramInfo.process。有没有办法只移动 ref_to_process 引用的 Process 呢?我尝试将最后一行更改为

*ref_to_process

但这不会编译,给出错误 "cannot move out of borrowed content"。

粗略阅读 sysinfo 箱子,答案是

似乎没有 returns 除了引用 Process 之外的任何方法;因此 System 永远不会放弃所有权,试图窃取它是不安全的...


一个对我来说似乎更可口的解决方案是将 ProgramInfo 更改为:

  • 坚持system: Lazy<System>,
  • 每次查询system当前PID。

效率如何取决于 system 是否每次都重新读取进程信息。


也就是说,从纯理论的角度,你确实可以偷走它:

  • 您可以使用ptr::read创建实例副本,
  • 然后在 system 上调用 mem::forget,这样 System 实例就会 泄漏 ,因此永远不会被销毁。

我怀疑这是你想要的,我绝对不会推荐它。