String and &str in rustについて
My first ever zine, titled "String and &str in Rust" and featuring many cats!✨😻🧶
— Jeena Lee (@thejeenalee) September 17, 2019
You can print it from here -> https://t.co/X1xQWrqzpC pic.twitter.com/qV68ZaDjZz
Twitterでみかけたこちら。
pdfから一部切り取って抜粋
String is a Vec
本当にそうだろうか。
RustのStringの実装を見てみると、
pub struct String { vec: Vec<u8>, }
String is a Vec
pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String { String { vec: bytes } }
rust/string.rs at master · rust-lang/rust · GitHub
String::from_utf8_unchecked
という、VecからStringを生成するunsafeなメソッドの実装を見ると、単にVecを移植しているだけなのでよさそうです。
fn main() { let text: String = "abcde".to_string(); let vector = unsafe { std::mem::transmute::<String, Vec<u8>>(text) }; println!("{:?}", vector); // => [97, 98, 99, 100, 101] let text: String = unsafe { std::mem::transmute::<Vec<u8>, String>(vector) }; println!("{}", text); // => abcde }
transmuteで相互に変換することもできました。
では、この図は正しいでしょうか
fn main() { println!("{}", std::mem::size_of::<String>()); // => 24 println!("{}", std::mem::size_of::<Vec<u8>>()); // => 24 }
StringもVec
上の図だと文字列の長さによってメモリ上のサイズが増えそうですが、StringもVec
こちらの記事にVecとSliceのメモリレイアウトについて書かれていますが、
上記の図はいかにもslice的ですね。
Vec
なので String and &str in rust
を鵜呑みにするとより混乱してしまうかも・・・と思いました。