[Rust学習] 所有権とポインタ

2024年4月2日

Rust プログラミング 学習

eyecatch C言語の難関ポイントであり、つまづきポイントであり、挫折ポイントである、ポインタがRustにも存在します。 これってメモリ管理を理解していないと行けないという点と、変数がどういう状態なん?という扱いの違いを理解する必要があるから、 初学者の人は、てんやわんやしてしまうんですよね。 インタプリタ言語ばかりやっているとあまりメモリ管理など気にしないでいいんですが、PHPやJavascriptでもなんちゃってポインタみたいなものがあるので、プログラミングの基礎知識として必要な要素でもあるかもです。

所有権について

Rustのポインタを理解する前に、Rust言語独特の機能である「所有権」という概念を理解しておきましょう。 メモリ管理をする手段が次の3つあります。
1. 明示的にメモリ管理をする。 2. ガベージ・コレクションで不要なメモリを自動で削除する。 3. 所有権というRust言語特有概念。
そもそもポインタを理解していない人が、ガベージコレクション(ガベコレ)と聞いても、頭パニックになるだけです。 下記参考リンクに、Wikipediaの解説ページを設置しておいたので、そちらを参照してみてください。

スタックとヒープ

メモリ管理において、重要な要素のスタックとヒープについて理解していきます。

スタック

「後入れ先出し」(last in, first out)という、メモリは、最後に入れたモノが先に出てくるという概念。 お片付けの概念やお店の在庫整理方法である「先入れ先出し」と比べると、効率がいいようには思えませんが、 コンピュータの概念は、この後入れ先出しが通常なのです。 配列でいうところの、PUSH(後に要素を追加)とPOP(最後の要素を取り除く)です。 これにより、スタックのメモリ操作は高速に行われるのですが、注意ポイントとしては、スタック上の全てのメモリ容量は同じにしておく必要があるという事です。

ヒープ

同じサイズのメモリを確保出来ない時は、ヒープを使ってメモリを使います。 ヒープは、ポインタを利用して、メモリを格納していきます。 この時に重要なのが、どこのメモリに格納したかという、メモリのアドレスを管理してメモリ管理を行い、このメモリ管理されているアドレスの事をポインタと言うんですね。

例え話

ディズニーランドで、数時間並んでアトラクションに乗る場合に、普通に並んで順番にアトラクションに乗るのがスタックで、 一方で、ファストパスやプレミアムチケットの様に並ばなくてもアトラクションに乗れるのがヒープと考えましょう。 順番にアトラクションの席に詰め込まれて、一定人数ごとに消化していくので、消化時間などが明確にできる一方、 ファストパスなどは、あらかじめ席を空き席を確保しておいて、そこに割り込みすることができるヒープは、裏技であり、多くの人が便利に思える機能です。

スライスについて

所有権の無いデータ型をスライスと言います。 メモリ管理の事を何も考えずにプログラミングすると、全てのデータをスライスとして扱うことになります。 小さなスニペットレベルのプログラムであれば、スライスで十分ですが、 アプリケーションレベルのプログラムを作る時は、所有権としてのメモリ管理を意識することが重要になります。

あとがき

今回の学習は、ソースコードを書かずに、メモリ概念の理解のみという、新しい単語がバンバンでてきて、 脳みそ沸騰しそうになりそうでしたが、C言語などを事前に学習していた人であれば、ほぼ復習だったでしょう。 個人的に、スタックとヒープが怪しかったんですが、ちゃんと理解できてプログラミングレベルが少し上った感じを持てました。 まだ、メモリ管理については、今後Rust言語でプログラミングをする時に、常につきまとう概念でもあるので、今回の学習で完了というワケではありません。 まだまだ入口状態です。 この後、ソースコードを書いて、コンパイルしてたくさんエラーを出して理解していくハズです。

参考

The Rust Programming Language 日本語版「所有権とは?」 Wikipedia「ガベージコレクション」

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。