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

时间:2017-08-16 10:37:06

标签: rust lazy-initialization

我一起使用lazy-initsysinfo个包装箱。获取有关流程的信息非常昂贵,所以我认为我会将其隐藏在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。有没有办法只移动Process引用的ref_to_process?我尝试将最后一行改为

*ref_to_process

但是这不会编译,给出错误“无法移出借来的内容”。

1 个答案:

答案 0 :(得分:2)

通过粗略阅读sysinfo包,答案是

似乎没有一种方法可以返回除Process之外的任何内容;因此System永远不会放弃所有权,试图窃取它是不安全的......

对我来说更合适的解决方案是将ProgramInfo更改为:

  • 抓住system: Lazy<System>
  • 每次查询system当前的PID。

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

话虽如此,从纯粹的理论立场,你无论如何都可以偷走它:

  • 您可以使用ptr::read创建实例的副本
  • 然后在mem::forget上致电system,以便System实例泄露,从而永不销毁。

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