下面是我的代码和相同的输出
fn main() {
let a : String = String::from("variable a");
println!("variable from main fun : {}", a);
println!("variable mem location {:p} ", &a);
move_function(a);
}
fn move_function(a: String) {
println!("variable from move_function fun : {}", a);
println!("variable mem location from move_function {:p} ", &a);
}
The output for the above code is
variable from main fun : variable a
variable mem location 0x7fff11676c70
variable from move_function fun : variable a
variable mem location from move_function 0x7fff11676d10
我希望main()函数和move_function()函数输出的内存地址是一样的,有人能帮我理解为什么它们不同吗?
2条答案
按热度按时间u3r8eeie1#
移动变量的作用与它所表示的完全相同:它会将其移动到不同的位置,因此它具有不同的地址。
也就是说,字符串的实际content没有移动,因为对于
String
类型,只有栈部分被移动,也就是24字节(在64位系统上):如果移动字符串,这24个字节也会移动,但字符串的内容会保持不变:
jjhzyzn02#
移动本质上是一种位对位的复制(memcpy),唯一的区别是编译器还跟踪被移动资源的所有权,并且在移动后不允许通过旧所有者访问。因此,回答这个问题,移动语义只是将位从源(旧所有者)复制到目标(新所有者),从而改变内存地址。
而且在某些情况下,据我所知,编译器可能会完全优化掉memcpy,重用旧地址,但那是完全不同的主题。