知りたいこと
- 構造体のフィールドが全てスタック上にある場合,MoveセマンティクスとCopyセマンティクスはほとんど同じ?
- そのような構造体には常にCopyトレイトを実装しても良い(もしくはいつ実装すべきか)?
内容
まず1についてです.struct Point { x: f64, y: f64 }
のような構造体をmoveすると,x
,y
の値がそれぞれコピーされます.実際,以下のようなコードを実行すると,r1
とr2
が別物であることが分かります.
Rust
1struct Point { x: f64, y: f64 } 2fn main() { 3 let r1 = Point { x: 0.0, y: 0.0 }; 4 println!("r1: {:p},{:p},{:p}", &r1, &r1.x, &r1.y); 5 let r2 = r1; 6 // println!("r1: {:p},{:p},{:p}", &r1, &r1.x, &r1.y); <- Compile error! 7 println!("r2: {:p},{:p},{:p}", &r2, &r2.x, &r2.y); 8}
r1: 0x7ffe4731eb48,0x7ffe4731eb48,0x7ffe4731eb50 r2: 0x7ffe4731ebe8,0x7ffe4731ebe8,0x7ffe4731ebf0
また,同じ構造体にCopyトレイトを実装した場合let r2 = r1;
はcopyセマンティクスになりますが,当然この時もx
,y
はコピーされます.
Rust
1#[derive(Clone, Copy)] 2struct Point { x: f64, y: f64 } 3fn main() { 4 let r1 = Point { x: 0.0, y: 0.0 }; 5 println!("r1: {:p},{:p},{:p}", &r1, &r1.x, &r1.y); 6 let r2 = r1; 7 println!("r1: {:p},{:p},{:p}", &r1, &r1.x, &r1.y); 8 println!("r2: {:p},{:p},{:p}", &r2, &r2.x, &r2.y); 9}
r1: 0x7fff72f1ee38,0x7fff72f1ee38,0x7fff72f1ee40 r1: 0x7fff72f1ee38,0x7fff72f1ee38,0x7fff72f1ee40 r2: 0x7fff72f1eed8,0x7fff72f1eed8,0x7fff72f1eee0
このPoint
のようにフィールドが全てスタック上にあるような構造体の場合,moveセマンティクスとcopyセマンティクスの違いはなんでしょうか?let r2 = r1;
のあとr1
が使える・使えない以外は同じに思えます.
そして2の質問ですが,もしmoveとcopyで同じようにコピーが発生するなら,Point
のような構造体には常にCopyトレイトを実装しても良いのでしょうか?どうせ全てコピーされるなら,Copyトレイトを実装していたほうができることが増えるから良いような気がします(例えばlet p = points[0]
).逆に,それが良くないことならば,Copyトレイトはいつ実装するのが正しいのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。