gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:07:45 25 4
gpt4 key购买 nike

我正在使用 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 中。 .有没有办法只移动 Processref_to_process 引用反而?我尝试将最后一行更改为

*ref_to_process

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

最佳答案

粗略阅读sysinfo crate,答案是

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


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

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

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


话虽如此,从纯理论的角度,您确实可以偷走它:

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com