我如何使用 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
实例就会 泄漏 ,因此永远不会被销毁。
我怀疑这是你想要的,我绝对不会推荐它。
我正在一起使用 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
实例就会 泄漏 ,因此永远不会被销毁。
我怀疑这是你想要的,我绝对不会推荐它。