2014-09-15 1 views
2

Я читаю return pointers part руководства Rust. Вот пример кода из него:Что происходит при возвращении указателей в ржавчине?

struct BigStruct { 
    one: int, 
    two: int, 
    // etc 
    one_hundred: int, 
} 

fn foo(x: Box<BigStruct>) -> BigStruct { 
    return *x; 
} 

fn main() { 
    let x = box BigStruct { 
     one: 1, 
     two: 2, 
     one_hundred: 100, 
    }; 

    let y = box foo(x); 
} 

Сильная часть следующего объяснения меня смущает:

Там нет копии в этом коде. main выделяет достаточно места для поля «box», передает указатель на эту память в foo как x, , а затем foo записывает значение прямо в этот указатель. Это записывает возвращаемое значение непосредственно в выделенное поле.

прочитав a related question, я до сих пор не получаю не ксерокопию пункта здесь.

Выполняет ли функция foo возвращает копию *x? Если это так, как понять объяснение? Если это не так, это связано с владением и заимствованием?

Я понимаю концепцию собственности и заимствований, я просто не знаю, когда это произойдет.

ответ

4

Руководство пытается сказать вам, что код ведет себя так, как будто это было написано так:

struct BigStruct { 
    one: int, 
    two: int, 
    // etc 
    one_hundred: int, 
} 

fn foo(x: Box<BigStruct>, result: &mut BigStruct) { 
    *result = *x; 
} 

fn main() { 
    let x = box BigStruct { 
     one: 1, 
     two: 2, 
     one_hundred: 100, 
    }; 

    unsafe { 
     let mut y = box std::mem::uninitialized(); 
     foo(x, &mut *y); 
    } 
} 

main создает Box и передает указатель на внутреннюю часть бокса в foo в качестве входного аргумента. Таким образом, foo может хранить результат непосредственно там, а не возвращать его и иметь main скопировать его в поле.

Существует копия, которая происходит в foo (от первого окна до второго блока), но если foo не писал непосредственно в поле, было бы две копии (возможно, одна из первой коробки в стек в foo, затем из стека во второй блок в main).

P.S .: Я думаю, что в руководстве есть ошибка. Он говорит:

передает указатель на эту память в обув в х

но x это окно, из которого мы пытаемся копировать, а не новая коробка ... Скорее всего, он передает указатель как скрытый аргумент.

+0

Это, кажется, разумный и правильный ответ, основанный на том, что я читал недавно. Я помню, что C++ использовали аналогичный механизм. –

+0

Кстати, у вас есть более подробные подсказки по темам, копирование и перемещение ...? Я почти прочитал все статьи, которые могу получить, кроме исходного кода. –

+0

Предлагаю вам задать новый вопрос. Мы сможем дать вам более подробный ответ таким образом. –