代码之家  ›  专栏  ›  技术社区  ›  Philip Daniels

如何使用sysinfo板条箱消除这个(似乎)不必要的clone()调用?

  •  2
  • Philip Daniels  · 技术社区  · 8 年前

    lazy-init 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() 让它编译,但它困扰着我,因为它似乎没有必要。正在制作流程结构的第二个副本,以便将其移动到 ProgramInfo.process 过程 引用人 ref_to_process 相反我试着把最后一行改成

    *ref_to_process
    

    1 回复  |  直到 8 年前
        1
  •  2
  •   Matthieu M.    8 年前

    从粗略的阅读 sysinfo 板条箱,答案是 .

    似乎没有一个方法只返回对的引用 Process System 永远不要放弃所有权,试图偷走它是不安全的。。。


    一个更适合我的解决方案是改变 ProgramInfo

    • 抓住一根绳子 system: Lazy<System> ,
    • 查询 system 每次用于当前PID。

    是否每次都重新读取进程信息。


    纯理论观点 ,无论如何,你确实可以偷走它:

    • 您可以使用 ptr::read 要创建实例的副本,
    • mem::forget 系统 所以 泄露 因此从未被摧毁。