Я прочитал, что память в 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 есть структура Foo
, выделенная в кадре стека функции bar()
. При выходе из bar()
стек раскручивается и освобождается память. Поскольку структура не реализует Copy
, память не копируется, так куда же она девается?
Я думаю, что здесь есть фундаментальная идея, которую я не понимаю.
1 ответ
1
Ваши экземпляры Foo
и Bar
хранятся в стеке. Когда функция возвращает экземпляр, данные перемещаются 2 из внутреннего кадра стека во внешний.
Поскольку структура не реализует
Copy
, память не копируется
Не в этом смысл черты Copy
( акцент мой):
Типы, значения которых можно дублировать простым копированием битов.
3
Единственная разница между «копией» и «перемещением» заключается в том, что копирование позволяет использовать как исходное, так и целевое значения, в то время как перемещение позволяет использовать только целевое значение.
<▪1 - Почти все. Я ожидал, что значения static
на самом деле не хранятся в стеке.
< sizes2 - Оптимизатор может фактически удалить перемещение, выделив структуру в кадре стека родительского для начала, а затем передав указатель в дочерний элемент. . Это называется оптимизацией возвращаемого значения .
< sizes3. Бывают случаи, когда значение не может быть перемещено. См. Раздел «Тип A со ссылкой на себя» в Почему я не могу сохранить значение и ссылку на это значение в одном и том же структура?.
Похожие вопросы
Связанные вопросы
Новые вопросы
memory-management
Процесс динамического распределения и освобождения частей физической памяти для того, чтобы отвечать на программные запросы с, по возможности, справедливостью и без голодания среди запрашивающих.