Фраза, когда из области видимости выходят значения, автоматически извлекаемые из стека, повторяется много раз, но приведенный здесь пример опровергает утверждение:
fn main() {
let foo = foobar();
println!("The address in main {:p}", &foo);
}
fn foobar() -> Employee {
let emp = Employee {
company: String::from("xyz"),
name: String::from("somename"),
age: 50,
};
println!("The address inside func {:p}", &emp);
emp
}
#[derive(Debug)]
struct Employee {
name: String,
company: String,
age: u32,
}
Результат:
The address inside func 0x7fffc34011e8
The address in main 0x7fffc34011e8
Это имеет смысл. Когда я использую Box
для создания структуры, адрес отличается, как я ожидал.
- Если функция возвращает право собственности (перемещение) возвращаемого значения вызывающей стороне, то после выполнения функции память, соответствующая этой функции, выскакивает, что небезопасно, тогда как структура, созданная внутри функции, становится доступной даже после выхода из функции?
- То же самое происходит при возврате массива. Где эти элементы хранятся в памяти, в стеке или в куче?
- Будет ли компилятор выполнять анализ выхода во время компиляции и перемещать значения в кучу, как это делает Go?
Я уверен, что Employee
не реализует черту Copy
.