見出し画像

RustのStringはいかにメモリ上に保存されるか?

みなさんRust使ってますか?
最近ますます盛り上がっていますよね。
そんなRustで文字列を表現する型である`String`ですが、裏側では少々複雑なメモリ表現になっているんです。
今回はそんな`String`メモリ上にどのように保存されているかを見ていきます。

例えば次のようなコード―

let s1 = String::from("Hello");

これは次の画像のように保存されます。

スタック上に次の3つの領域が確保されます。

  • ptr

    • 実際に`Hello`という文字列が格納されたヒープ領域を指すポインタ

  • capacity

    • ヒープ上に確保された領域の大きさ

    • この例だと5

  • len

    • 実際にヒープ上に確保された要素の数

    • この例だと5

そしてスタック自体のサイズは`usize`×3です。
例えば64bitのパソコンであれば8×3=24byteですね。

簡単な説明としては以上です。
実のところ`String`型は`Vec<u8>`をフィールドに持つ構造体なんですよね。

pub struct String {  
	vec: Vec<u8>,  
}

なので上述のメモリ構造も実は`Vec`そもそもそうなっているのです。

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!