我读到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都以某种方式存储在堆栈上。即使在进行堆分配时,指针本身也存储在堆栈上。
Foo
和Bar
实例存储在堆栈中。当函数返回实例时,数据从内部堆栈帧移动到外部堆栈帧。
由于结构不实现
Copy
,因此不会复制内存
这不是Copy
特征(强调矿(的含义:
其值可以通过复制位来复制的类型。
Rust中的所有3都可以移动。如果这不是真的,那么这种语言将很难使用!数据会从一个堆栈帧移动到另一个堆栈框架。
唯一的区别是;复制";和一个";移动";是副本允许同时使用源值和目标值,而移动仅允许使用目标值。
1
-几乎所有。我预计static
值实际上并没有存储在堆栈中。
2 -优化器实际上可能会通过在父级的堆栈帧中分配结构来移除移动,然后将指针传递到子级。这被称为返回值优化。
3 -有些病理病例的值无法移动。参见";一种引用自身的类型";为什么我不能在同一个结构中存储一个值和对该值的引用?。