将数据移动到Rc/Arc是否总是将其从堆栈复制到堆?
看下面这个简单的例子:
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了在堆中分配的 type 值的共享所有权。
理论上是清楚的。但是,首先my_struct不是立即包装成Rc,其次MyStruct是一个非常简单的类型。我可以在这里看到 2 个场景。
- 当
my_struct被移入Rc内存内容时,它会从堆栈中复制到堆中。 - 编译器能够解决
my_struct将移入 的问题Rc,因此它从一开始就将其放在堆中。
如果数字 1 为真,那么可能存在一个隐藏的性能瓶颈,因为在阅读代码时没有明确看到内存被复制(我假设MyStruct要复杂得多)。
如果数字 2 为真,我想知道编译器是否总是能够解决这些问题。提供的示例非常简单,但我可以想象它my_struct要复杂得多,并且在移动到Rc.