Данные Structure
в my_struct_boxed
существуют в куче, а данные Structure
в my_struct_unboxed
существуют в стеке.
Поэтому наивно говоря (без оптимизации компилятора ), операция перемещения или копирования при разыменовании (*
) вашего Box
всегда будет включать копирование данных. Что касается анализа заимствования / анализа c, поскольку признак Copy
не реализован для Structure
, это означает передачу права собственности на данные в переменную my_struct_unboxed
.
Когда вы вызываете print_struct
, происходит другая копия, которая будет копировать биты в памяти, представляющие ваш Structure
из локальной переменной, в стек вызовов аргументов функции. Семантически, это снова представляет передачу права собственности на функцию print_struct
.
Наконец, когда print_struct
выходит из области видимости, он отбрасывает принадлежащий ему Structure
.
Ссылка: std::marker::Copy
Отрывок
Важно отметить, что в этих двух примерах единственное различие заключается в том, разрешен ли вам доступ к [вашему переменная] после назначения. Под капотом и копирование, и перемещение могут привести к копированию битов в памяти, хотя иногда это оптимизируется.
Обратите внимание на последнюю часть: «иногда это оптимизируется». Вот почему более ранние описания были упрощены, чтобы не предполагать оптимизацию компилятора, т.е. наивно. Во многих случаях компилятор будет активно оптимизировать и вставлять код, особенно с более высокими значениями для флага opt-level
.