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

标签 rust lazy-initialization

我正在使用lazy-initsysinfo crate 在一起。获取有关进程的信息非常昂贵,因此我想将其隐藏在 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

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

最佳答案

粗略阅读 sysinfo crate ,答案是

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


对我来说似乎更容易接受的解决方案是更改 ProgramInfo至:

  • 捕获system: Lazy<System> ,
  • 查询system每次针对当前PID。

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


话虽如此,从纯粹理论的角度来看,无论如何你确实可以窃取它:

  • 您可以使用ptr::read创建实例的副本,
  • 然后调用mem::forgetsystem所以System实例泄露,因此从未被销毁。

我怀疑这就是你想要的,我当然不会推荐它。

关于rust - 如何使用 sysinfo 箱消除这个(看似)不必要的 clone() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711295/

相关文章:

rust - 如何生成模板化的 const 声明?

rust - 如何将 number::Rational 转换为十进制数?

ios - 如何防止在 Swift 中延迟加载静态变量

c# - 不使用空合并运算符进行延迟初始化有什么好的理由吗?

scala - 使用惰性参数初始化类时 Scala 编译器的奇怪行为

rust - 在Rust中使用单个增变器进行无锁数据共享

rust - 比赛背后的魔力:没有对`&std::option::Option <ListNode>的实现== std::option::Option <_>

module - 使用嵌套模块中的项目时为 "unresolved import"

java - Spring JPA - org.hibernate.LazyInitializationException : could not initialize proxy - no Session

java - 为什么在一个 Set 上使用 FetchType.LAZY 时会出现 LazyInitializationException,而在另一 Set 上则不会?