Я прочитал, что память в 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, память не копируется, так куда же она девается?

Я думаю, что здесь есть фундаментальная идея, которую я не понимаю.

0
amitayh 4 Авг 2020 в 17:17

1 ответ

Лучший ответ

1

Ваши экземпляры Foo и Bar хранятся в стеке. Когда функция возвращает экземпляр, данные перемещаются 2 из внутреннего кадра стека во внешний.

Поскольку структура не реализует Copy, память не копируется

Не в этом смысл черты Copy ( акцент мой):

Типы, значения которых можно дублировать простым копированием битов.

3

Единственная разница между «копией» и «перемещением» заключается в том, что копирование позволяет использовать как исходное, так и целевое значения, в то время как перемещение позволяет использовать только целевое значение.


<▪1 - Почти все. Я ожидал, что значения static на самом деле не хранятся в стеке.

< sizes2 - Оптимизатор может фактически удалить перемещение, выделив структуру в кадре стека родительского для начала, а затем передав указатель в дочерний элемент. . Это называется оптимизацией возвращаемого значения .

< sizes3. Бывают случаи, когда значение не может быть перемещено. См. Раздел «Тип A со ссылкой на себя» в Почему я не могу сохранить значение и ссылку на это значение в одном и том же структура?.

5
Shepmaster 4 Авг 2020 в 14:40