RustのBoxでデータをヒープ領域に割り当てる

Boxというのがちらほら出てくるが、これは対象のデータをヒープに割り当てるらしい。

ヒープとはなんぞやということで、それについてはこちらで解説されていた。まずメモリ管理にはスタックとヒープという用語がある。

スタックはとても高速で、Rustにおいてデフォルトでメモリが確保される場所です。 しかし、このアロケーションはひとつの関数呼び出しに限られた局所的なもので、サイズに制限があります。 一方、ヒープはより遅く、プログラムによって明示的にアロケートされます。 しかし、事実上サイズに制限がなく、広域的にアクセス可能です。

ということで、さらに下まで呼んでいくと、ヒープはスタックよりも長く残る仕掛けがあって、このおかげで異なる最終的にはDropトレイトによってアロケートされたメモリをデアロケートするとのこと。

で、これだけだとどんな時に使うのかイマイチだったので、さらにBox<T>はヒープのデータを指し、既知のサイズであるを読んでみたらわかりやすく書いてあった。

  • コンパイル時にはサイズを知ることができない型があり、正確なサイズを要求する文脈でその型の値を使用する時
  • 多くのデータがあり、所有権を転送したいが、そうする時にデータがコピーされないことを確認する時
  • 値を所有する必要があり、特定の型ではなく特定のトレイトを実装する型であることのみ気にかけている時

で、下まで読んでいくと具体的な説明がある。結構Rustでコードを書いているとコンパイラがBoxを使わなきゃだめだぞと怒ってくれていたような記憶がある(たぶん)。今後Boxを使わなきゃいけないシーンになったら、ああヒープに持っていかなきゃいけないからだねと理解しながらかけるので少し分かった気になった。

またVecやStringもヒープに割り当てるので、無闇に多様しないほうがいいんだなあと心で分かった。結構多様しがちだったので。例えば、Stringを生成してから&Stringで参照を得た場合のstrはStringのヒープ領域が参照先になっておるが、これをまたStringにし直したりと多重に生成してしまっていたことがあったが、Stringを一度参照したらなるべく参照し続けて使い回すのが良さそうだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA