после ссылки не то же самое до ссылки - PullRequest
0 голосов
/ 28 марта 2020

В документации Rust написано следующее:

let s1 = String::from("hello");
let s2 = s1;

Когда мы назначаем s1 для s2, данные String копируются, то есть мы копируем указатель, длину и емкость, которые в стеке. Мы не копируем данные в кучу, на которую ссылается указатель.

Когда я запускаю следующий код,

let s1 = String::from("aa");
let p2 = &s1;
println!("p2:{:p}", p2);
let s2 = s1;
let p3 = &s2;
println!("p3:{:p}", p3);

Вывод:

p2:0x7ffc1bd2e730
p3:0x7ffc1bd2e7a0

Почему адрес, указанный p2, и адрес, указанный p3, не совпадают?

1 Ответ

1 голос
/ 28 марта 2020

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());
}

Вышеуказанная программа выдает тот же адрес памяти.

...