Rustのライフタイムとか所有権は馴染みがないのでとても難しい
なんとなく一番わかりやすかったのでメモ
- メモリについて全く気にしなくていい言語もあれば、自分で allocate したり解放したりしないといけない言語もある。Rust はさらに別の所有権を通じてメモリを管理するアプローチをとっている
- スタックには固定サイズのデータ、つまりポインタなどが入れられる。こちらは allocate とは呼ばない。場所もサイズも分かっているのでスタックにデータを入れる作業はとても速い
- ヒープにはサイズのわからないデータをある一定のスペースを確保して格納する。空いているスペースを探すために、スタックにデータを入れるよりもヒープに allocate するほうが時間がかかる
- 何となーく雑に理解した後にRust本を読むと内容がたまに入ってきやすい
- サイズ固定の変数をイコールで繋いだ時(integer, booleanなど)は値がそのままコピーされてスタックで管理される
- Stringなどのサイズがわからないものを使った時は、実データへの参照・lengthやcapacityの情報を持ったものが新しく作られる、このときに古い変数の持っていた同じ情報は無効化される(=所有権の移動)。それをしないと両方の変数のライフタイムが終了したときに二重に実データのメモリの解放が発生する可能性があるため。
clone
メソッドなどを使って意図してディープコピーを作ることができるが、これはコストの高い作業となる(実データごと作り直してヒープで管理するから)