Masalah ini sepertinya menyiratkan bahwa ini hanya detail implementasi ( memcpy
vs ???), tetapi saya tidak dapat menemukan deskripsi eksplisit tentang perbedaannya.
128
Masalah ini sepertinya menyiratkan bahwa ini hanya detail implementasi ( memcpy
vs ???), tetapi saya tidak dapat menemukan deskripsi eksplisit tentang perbedaannya.
Jawaban:
Clone
dirancang untuk duplikasi sewenang-wenang:Clone
implementasi untuk suatu jenisT
dapat melakukan operasi rumit sewenang-wenang yang diperlukan untuk membuat yang baruT
. Ini adalah sifat normal (selain di awal), dan karenanya membutuhkan penggunaan seperti sifat normal, dengan pemanggilan metode, dll.The
Copy
sifat mewakili nilai-nilai yang dapat dengan aman digandakan melaluimemcpy
: hal-hal seperti penugasan kembali dan melewati sebuah argumen dengan-nilai ke fungsi selalumemcpy
s, dan sebagainya untukCopy
jenis, compiler mengerti bahwa hal itu tidak perlu mempertimbangkan mereka bergerak .sumber
Clone
salinan dalam, danCopy
salinan bayangan?Clone
membuka kemungkinan bahwa tipe dapat melakukan salinan dalam atau dangkal: "rumit secara sewenang-wenang".Perbedaan utamanya adalah kloning itu eksplisit. Notasi implisit berarti pindah untuk non-
Copy
tipe.Omong-omong, setiap
Copy
tipe juga harus adaClone
. Namun, mereka tidak diharuskan melakukan hal yang sama! Untuk tipe Anda sendiri,.clone()
bisa menjadi metode arbitrer pilihan Anda, sedangkan penyalinan implisit akan selalu memicu amemcpy
, bukanclone(&self)
implementasi.sumber
y
dipindahkanx
, bukan salinannya, seperti contoh terakhir yang Anda beri komentarw = v
. Bagaimana Anda menjelaskannya?Copy
dimaksudkan untuk diterapkan untuk jenis "murah", sepertiu8
dalam contoh. Jika Anda menulis tipe yang cukup kelas berat, yang menurut Anda memindahkan lebih efisien daripada salinan, buatlah tidak tersiratCopy
. Perhatikan bahwa dalam kasus u8, Anda tidak mungkin bisa lebih efisien dengan pemindahan, karena di bawah kap itu mungkin setidaknya memerlukan salinan pointer - yang sudah semahal salinan u8, jadi mengapa repot-repot.Copy
sifat berdampak pada cakupan variabel seumur hidup implisit? Jika demikian saya pikir itu penting.Seperti yang sudah tercakup oleh jawaban lain:
Copy
implisit, murah, dan tidak dapat diimplementasikan kembali (memcpy).Clone
eksplisit, mungkin mahal, dan dapat diterapkan kembali secara sewenang-wenang.Apa yang terkadang hilang dalam pembahasan
Copy
vsClone
adalah bahwa hal itu juga mempengaruhi bagaimana kompilator menggunakan perpindahan vs salinan otomatis. Misalnya:Contoh pertama (
PointCloneAndCopy
) berfungsi dengan baik di sini karena salinan implisit, tetapi contoh kedua (PointCloneOnly
) akan mengalami kesalahan dengan penggunaan setelah pemindahan:Untuk menghindari pemindahan implisit, kita bisa memanggil secara eksplisit
let p2 = p1.clone();
.Ini mungkin menimbulkan pertanyaan tentang bagaimana memaksa perpindahan dari tipe yang mengimplementasikan sifat Salin? . Jawaban singkatnya: Anda tidak bisa / tidak masuk akal.
sumber