2
This article似乎意味着在生鏽文檔中使用術語「移動」並不意味着副本,而是編譯時所有權的轉移。具體請參閱此報價:擁有指針的移動的語義
編譯器強制只有一個所有者。指定新位置的指針會轉移所有權(簡稱爲移動)。考慮這個程序:
這是正確的嗎?所有權轉移/移動實際上並不是在運行時複製,而只是編譯時抽象。
This article似乎意味着在生鏽文檔中使用術語「移動」並不意味着副本,而是編譯時所有權的轉移。具體請參閱此報價:擁有指針的移動的語義
編譯器強制只有一個所有者。指定新位置的指針會轉移所有權(簡稱爲移動)。考慮這個程序:
這是正確的嗎?所有權轉移/移動實際上並不是在運行時複製,而只是編譯時抽象。
不,移動仍然是一個副本(在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++中的變量一樣),如果某些值具有某個值,則該值必須位於適當的位置內存中;這意味着移動(通常涉及將數據從一個變量傳輸到另一個變量)必須實際執行復制。
好吧,這完全有道理,它需要這樣。指針全部分配給堆棧,至少如果它們沒有嵌套在分配給枚舉的堆中,對吧? – tehgeekmeister
是的,任何'let'左邊的變量都在堆棧中,包括像let a =〜1這樣的指針。 – huon
(也就是說,它在堆棧中,如果它存在於內存中:通常變量可以被優化掉,或者完全放在寄存器中。) – huon