2013-07-11 43 views
2

This article似乎意味着在生锈文档中使用术语“移动”并不意味着副本,而是编译时所有权的转移。具体请参阅此报价:拥有指针的移动的语义

编译器强制只有一个所有者。指定新位置的指针会转移所有权(简称为移动)。考虑这个程序:

这是正确的吗?所有权转移/移动实际上并不是在运行时复制,而只是编译时抽象。

回答

3

不,移动仍然是一个副本(在memcpy意义上),虽然不一定是整个数据结构。但是,它具有您列出的编译时语义。也就是说,

let a = ~[1,2,3]; 
let b = a; // copies one word (the pointer), "moves" the data. 

let c = b.clone(); // copies the data too. 

(请注意,我用b.clone()而不是copy b,因为Copy is being removed,并通过Clone取代,后者是更强大/灵活。)

这种复制行为是必须发生的,因为Rust中的(很多)变量是确定的内存块(就像C/C++中的变量一样),如果某些值具有某个值,则该值必须位于适当的位置内存中;这意味着移动(通常涉及将数据从一个变量传输到另一个变量)必须实际执行复制。

+0

好吧,这完全有道理,它需要这样。指针全部分配给堆栈,至少如果它们没有嵌套在分配给枚举的堆中,对吧? – tehgeekmeister

+1

是的,任何'let'左边的变量都在堆栈中,包括像let a =〜1这样的指针。 – huon

+2

(也就是说,它在堆栈中,如果它存在于内存中:通常变量可以被优化掉,或者完全放在寄存器中。) – huon