其中是一个没有't实现分配的拷贝,如何从函数返回



我读到Rust中的内存默认在堆栈上分配,除非明确告诉编译器使用Box或其他方法使用堆。

我知道所有权在函数调用之间移动,但结构的内存实际分配在哪里?如果它在堆栈上,那么当函数退出时会发生什么?

#[derive(Debug)]
struct Foo(i32);
#[derive(Debug)]
struct Bar(Foo);
fn foo() -> Foo {
Foo(42)
}
fn bar() -> Bar {
let f = foo();
Bar(f)
}
fn main() {
let bar = bar();
println!("{:?}", bar);
}

例如,在第12行,在bar()函数的堆栈帧中分配了一个Foo结构。当bar()退出时,堆栈将展开并回收内存。由于结构体没有实现Copy,所以内存不会被复制,那么它会去哪里呢?

我认为这里有一个基本的想法我不明白。

所有1都以某种方式存储在堆栈上。即使在进行堆分配时,指针本身也存储在堆栈上。

FooBar实例存储在堆栈中。当函数返回实例时,数据从内部堆栈帧移动到外部堆栈帧。

由于结构不实现Copy,因此不会复制内存

这不是Copy特征(强调矿(的含义:

其值可以通过复制位来复制的类型。

Rust中的所有3都可以移动。如果这不是真的,那么这种语言将很难使用!数据会从一个堆栈帧移动到另一个堆栈框架。

唯一的区别是;复制";和一个";移动";是副本允许同时使用源值和目标值,而移动仅允许使用目标值。


1 -几乎所有。我预计static值实际上并没有存储在堆栈中。

2 -优化器实际上可能会通过在父级的堆栈帧中分配结构来移除移动,然后将指针传递到子级。这被称为返回值优化

3 -有些病理病例的值无法移动。参见";一种引用自身的类型";为什么我不能在同一个结构中存储一个值和对该值的引用?。

最新更新