1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(DAY10) 俺と学ぶRust言語~所有権~

Posted at

今日の内容

  • 所有権ってなんぞや

はじめに

「所有権システム」という言葉に聞き覚えがない方もいるかもしれません。というのも、「所有権システム」は、Rust特有の機能だからです。この「所有権システム」は、もはや、「Rustにおける最大の特徴の一つ」 と言っても過言ではありません。

所有権システムとは?

「所有権システム」とは一体なんでしょうか。
それは、Rustでの「メモリ管理機構」のことです。
メモリには容量の上限があります。効率よく使用するために、必要なメモリ領域を割り当てたり、不要になったメモリ領域を解放したりして、メモリを管理する機能です。

1. 所有権システムの基本概念

Rustでは、すべての値に「所有者」が存在します。所有権システムは、次の三つのルールで構成されます。

  1. 各値は所有者と呼ばれる変数に所有される
  2. ある値の所有者は同時に一つしか存在しない
  3. 所有者がスコープから外れると、値は自動的に解放される

2. C言語との対比

[メモリ管理の方法]
C: メモリ管理は手動。mallocやcallocを使ってメモリを確保し、freeを使ってメモリを解放する。不適切な管理をすると以下の問題が発生する。

  • メモリリーク: メモリの解放を忘れて、使われないメモリが溜まり続ける
  • ダングリングポインタ: 解放済みのメモリを参照しようとして、未定義動作が発生する
  • 二重解放: 同じメモリを2回解放し、メモリ内のデータが消えて予期せぬことやエラーが発生する

Rust: 所有権システムがこれらの問題をコンパイル時に防止する。Rustでは明示的なメモリ管理は不要で、所有者がスコープを抜けた時点でメモリは自動解放される。

[並行性]
C: マルチスレッド環境でメモリを共有すると、データ競合 が発生する可能性がある。手動でロックや同期を行う必要があるが、管理が複雑で大変。バグが発生しやすい。

Rust: 所有権システムに加え、借用 と参照の仕組みでコンパイル時にデータ競合を防ぐ。

  • 不変の借用: 同時に複数のスレッドで参照可能
  • 可変の借用: 一つのスレッドでしか変更できない

GC(ガーベージコレクション)との違い

GCとは、「ガーベージコレクション」のことで、自動的にメモリ領域を解放する機能です。JavaやPHPなどのさまざまな言語に備わっています。一見、所有権システムに似ていますが、結構異なります。
まず、所有権システムはコンパイル時にメモリを確保します。所有権がどこにあるかを考えることで、どこでメモリが確保され、どこでメモリが解放されるかが明確になります。
一方、GCは自動的にメモリ管理をしてくれますが、どこでメモリを解放するのか明確ではありません。また、動的な処理によりパフォーマンス低下の恐れがあります。

最初はこの仕組みが堅苦しく、難しいものに感じるかもしれません。Rustはエラーを吐き出して、嫌になるかもしれません。しかし、これを理解したときにはきっとRustの素晴らしさを感じているでしょう。

おわりに

今日はプログラミングしていませんが、それに相当するほどの学習をしました。Rustは所有権システム様によって、安全性と効率性を維持できるのですね。次回はクレートについて学び、いくつかの外部クレートを使って、ゲームでも作ってみようかと思います。
ご精読ありがとうございました、

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?