関係書目スタックとヒープRustはシステム言語なので、低水準の操作を行います。あなたが高水準言語を使ってきたのであれば、システムプログラミングのいくつかの側面をよく知らないかもしれません。重要なのは、スタックとヒープと関連してメモリがどのように機能するかということです。C言語のような言語でスタックアロケーションをどのように使っているかをよく知っているのであれば、この章は復習になるでしょう。なければ、このより一般的な概念について、Rust流の焦点の絞り方ではありますが、学んでゆくことになるでしょう。ほとんどの物事と同様に、それらについて学ぶにあたって、まず簡略化したモデルを使って始めましょう。することで、今は無関係な枝葉末節に足を取られることなく、基本を把握できます。これから使う例示は100%正確ではありませんが、現時点で学ぼうとするレベルのための見本になっています。ひとたび基本を飲み込めば、アロケータがどう実装されているかや仮想メモリなどの発展的なトピックを学ぶことによって、この特殊な抽象モデルが取り漏らしているものが明らかになるでしょう。メモリ管理これら2つの用語はメモリ管理についてのものです。スタックとヒープは、いつメモリをアロケート・デアロケートするのかを決定するのを助ける抽象化です。大まかに比較してみましょう:スタックはとても高速で、Rustにおいてデフォルトでメモリが確保される場所です。このアロケーションはひとつの関数呼び出しに限られた局所的なもので、サイズに制限があります。ヒープはより遅く、プログラムによって明示的にアロケートされます。事実上サイズに制限がなく、広域的にアクセス可能です。束縛をひとつ含んでいます。このメモリはどこかからアロケートされる必要があります。Rustはデフォルトで「スタックアロケート」、すなわち基本的な値を「スタックに置く」ということをします。それはどういう意味でしょうか。関数が呼び出されたとき、関数中のローカル変数とそのほかの多少の情報のためにメモリがいくらかアロケートされます。これを「スタックフレーム」と呼びますが、このチュートリアルにおいては、余分な情報は無視して、アロケートするローカル変数だけを考えることにします。実行されるとき、スタックフレームとして32ビット整数をただ1つアロケートすることになります。これは、見ての通り自動的に取り扱われるので、特別なRustコードか何かを書く必要はありません。関数が終了するとき、スタックフレームはデアロケートされます。これもアロケーションと同様自動的に行われます。これが、この単純なプログラムにあるものすべてです。ここで理解する鍵となるのは、スタックアロケーションはとても、とても高速だということです。ローカル変数はすべて事前にわかっているので、メモリを一度に確保できます。破棄するときも同様に、変数をすべて同時に破棄できるので、こちらもとても高速に済みます。この話でよくないことは、単一の関数を超えて値が必要でも、その値を保持しつづけられないことです。「スタック」が何を意味するのかについてまだ話していませんでした。その点について見るために、もう少し複雑な例が必要です。1つで、全部で3つあります。呼び出されたときは1つの整数がスタックフレームとしてアロケートされます。呼び出されたときに何が起こるかを話す前に、まずメモリ上に何が置いてあるかを図示する必要があります。オペレーティングシステムは、メモリをプログラムに対してとてもシンプルなものとして見せています。それは、0からコンピュータが搭載しているRAMの容量を表現する大きな数までのアドレスの巨大なリストです。あなたのコンピュータに1ギガバイトのRAMがのっていれば、アドレスは0から1,073,741,823になります。この数値は、1ギガバイトのバイト数である230から来ています。1このメモリは巨大な配列のようなものです。アドレスは0から始まり、最後の番号まで続いています。スタックフレームのために使われます。これは、関数呼び出しが行われるたびに上に伸びていきます。ここで注意しなければならない重要なことがいくつかあります。いった番号は単に解説するためのもので、コンピュータが実際に使うアドレス値とは関係がありません。連続したアドレスは、実際にはそれぞれ数バイトずつ隔てられていて、その間隔は格納されている値のサイズより大きいこともあります。後には、残っている値も消えてなくなります。plates)のように働くことに由来します。最初に置かれたプレートは、最後に取り去られるプレートです。最後に入ったものが最初に出るキュー、LIFOと略記される)と呼ばれ、最後にスタックに積んだ値は最初にスタックから取り出す値になります。bold();}分かりやすいようにちょと変な名前をつけています。42ふう、スタックが高く伸びましたね。42ついに、やりとげました。皿を積み重ねるようなものです。上に追加し、一番上から取るんです。ヒープさて、このやり方は結構うまくいくのですが、すべてがこのようにいくわけではありません。ときには、メモリを異なる関数間でやりとりしたり、1回の関数実行より長く保持する必要があります。そのためには、ヒープを使います。型を使うことで、メモリをヒープ上にアロケートできます。??????2つの変数のために、スタック上に領域がアロケートされます。型で、ボックスはヒープ上のメモリをアロケートします。このボックスの実際の値は、「ヒープ」へのポインタを持ったストラクチャです。