Rustの抽象概念ムーブがどのように機械語で実装されるのか?
それがRustの高速性を決めている
普通によくあるx86-64bitのLinux環境で関数が値を返すときのムーブの実装について見てみよう
64bit二つ分までのサイズのデータを関数が返す時は64bitレジスタraxとrdxに入れて返す
しかし>>862の構造体Xxxのサイズがその128bit (=16byte)を超えていてレジスタ返しができない場合はどうなるだろう?
Rustでは関数f()でのデータ受け取り変数xのアドレスを隠れた引数として関数new()へレジスタ渡しする
new()ではそのアドレスへ直接データを書き込んでXxx構造体を作っていく

関数が多段で孫関数からXxxを返す場合でも子関数から孫関数へ隠れた引数としてアドレスが同様に渡される
孫関数は祖父関数のスタックフレームへ直接データを書き込むことになる

ムーブは抽象概念に過ぎないため実際にデータを移動(コピー)させる必要はない
最初から最終移動先へデータを書き込むことでRustは無駄なコピーを排除している