【发布时间】:2021-10-20 21:07:30
【问题描述】:
看看下面这个简单的例子:
use std::rc::Rc;
struct MyStruct {
a: i8,
}
fn main() {
let mut my_struct = MyStruct { a: 0 };
my_struct.a = 5;
let my_struct_rc = Rc::new(my_struct);
println!("my_struct_rc.a = {}", my_struct_rc.a);
}
Rc的官方文档说:
Rc<T>类型提供T类型值的共享所有权, 在堆中分配。
理论上是清楚的。但是,首先my_struct 不会立即包装到Rc 中,其次MyStruct 是一个非常简单的类型。我可以在这里看到 2 个场景。
- 当
my_struct移动到Rc时,内存内容实际上是从堆栈复制到堆。 - 编译器能够解析
my_struct将被移动到Rc,因此它从一开始就把它放在堆上。
如果数字 1 为真,那么可能存在一个隐藏的性能瓶颈,因为在阅读代码时没有明确看到内存被复制(我假设 MyStruct 要复杂得多)。
如果数字 2 为真,我想知道编译器是否总是能够解决此类问题。提供的示例非常简单,但我可以想象my_struct 要复杂得多,并且在移动到Rc 之前会被不同的函数多次变异。
【问题讨论】:
-
这可能对reddit.com/r/rust/comments/hemjx0/… 有所帮助,并且还可以搜索 rust 中的新位置。
-
对
Rc::new()的函数调用将值移动到函数中,并且无论何时执行此操作,该值可能实际上会被复制——这里没有隐藏任何内容。编译器也可能能够优化它,但你永远无法保证它会。我建议不要担心。即使对于更复杂的值,复制一个值也很便宜,而且在几乎所有情况下,分配的成本都会使移动的成本相形见绌。可能存在一些重要的极端情况,但它们应该非常罕见。
标签: rust