kieran

Kieran‘s Blog

The world will be better?
github

rustの基本文法学習(1)

rust の基本文法学習#

この記事では『Comprehensive Rust』教材を学習素材として使用し、rust の文法に素早く慣れることを目指します。また、范長春先生の『深入浅出 Rust』を読みながら理解を深めます。

筆者は以前 cpp 開発を行っていたため、rust を学ぶ過程で無意識に cpp と比較し、文法の違いを考え、なぜそのようにするのかを探求します。

  • 共有参照と独占参照について

rust には cpp のように開発者にポインタを使用する権利が与えられていないようで、参照という概念のみが存在します(参照の本質はポインタですが)。参照は共有参照と独占参照に分かれ、記号上の直感的なイメージは &T&mut T です。主な違いは借用ルールにあります。

共有参照(&T):共有参照は読み取り専用アクセスで、指し示す値を変更することはできません。この利点は、複数の借用を許可し、マルチスレッドアクセスが比較的安全であることです。

独占参照(&mut T):独占参照はデータの変更を許可しますが、独占参照は一つだけ存在でき、共有参照は存在できません。

これらのルールは rust コンパイラによってコンパイル時に強制され、二種類の参照タイプはメモリとスレッドの安全性を保証します。cpp では const や & があり、四つの異なる状況が存在します。

  • 二種類の文字列 String&str

rust には二種類の文字列タイプがあります。String はヒープメモリに格納され、所有権を持つ utf-8 エンコードされた文字列です。一方、&str は utf-8 エンコードされた文字列のスライスで、&[u8] に相当します。

fn main() {
    let s1: &str = "World";
    let mut s2: String = String::from("Hello ");
}

上記のコードでは s1 は World という文字列のスライスであり、これは借用です。この World は実際にはプログラムの読み取り専用データセクションに格納されています。一方、s2 という変数はヒープメモリに格納され、s2 はこの文字列の所有権を持っています。

このような設計を見た後、なぜスタック上に文字列を割り当てる方法がないのかを考えました。一部のローカル変数は特定のスコープ内でのみ定義されているため、各文字列リテラルが読み取り専用データセクションに存在すると、冗長なメモリ使用が発生しないでしょうか?

GPT に質問したところ、以下のような回答が得られました:1. s1 は実際にはスタック上の変数に相当し、s1 は読み取り専用区の文字列リテラルに責任を持つ必要がありません。この World はプログラム終了後にシステムによって処理されます。一方、s2 のヒープ上の文字列は、s2 のライフサイクルが終了する際に drop 関数が呼び出されてメモリが回収されます。2. 大まかな結論は、Rust のコンパイラとリンカはコード内の文字列の使用に対して一連の最適化を行い、この問題を心配する必要はないということです(具体的にどのような最適化が行われたかは自分で検索して学んでみてください)。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。