s1
- это struct
, который содержит: * длину строки (т. Е. 2 для aa
) * емкость строки (т. Е. Не менее 2 для aa
, поскольку уже есть 2 символа там) * указатель на память, содержащую действительные символы
Теперь, если вы переместите s1
на s2
, длина, емкость и указатель будут переведены в s2
. Но нигде не сказано, что s2
занимает то же место в памяти, что и s1
. Это то, что вы наблюдаете в своей программе.
Однако, , поскольку только указатель перемещен на s2
, он все еще ссылается на ту же память, содержащую действительные символы. Это можно наблюдать, изучив as_bytes
:
fn main() {
let s1 = String::from("aa");
println!("p2:{:p}", s1.as_bytes());
let s2 = s1;
println!("p2:{:p}", s2.as_bytes());
}
Вышеуказанная программа выдает тот же адрес памяти.