Esse problema parece sugerir que é apenas um detalhe da implementação ( memcpy
vs ???), mas não consigo encontrar nenhuma descrição explícita das diferenças.
127
Esse problema parece sugerir que é apenas um detalhe da implementação ( memcpy
vs ???), mas não consigo encontrar nenhuma descrição explícita das diferenças.
Respostas:
Clone
foi projetado para duplicações arbitrárias: umaClone
implementação para um tipoT
pode executar operações arbitrariamente complicadas, necessárias para criar um novoT
. É uma característica normal (além de estar no prelúdio) e, portanto, exige ser usada como uma característica normal, com chamadas de método etc.A
Copy
característica representa valores que podem ser duplicados com segurança viamemcpy
: coisas como reatribuições e passar um argumento por valor para uma função são semprememcpy
s, e, para osCopy
tipos, o compilador entende que não precisa considerar essas mudanças .fonte
Clone
é uma cópia em profundidade e é uma cópia emCopy
sombra?Clone
abre a possibilidade de que o tipo possa fazer uma cópia profunda ou superficial: "arbitrariamente complicado".A principal diferença é que a clonagem é explícita. Notação implícita significa mover para um não-
Copy
tipo.A propósito, todo
Copy
tipo também é necessárioClone
. No entanto, eles não são obrigados a fazer a mesma coisa! Para seus próprios tipos,.clone()
pode ser um método arbitrário de sua escolha, enquanto a cópia implícita sempre acionará umamemcpy
, não aclone(&self)
implementação.fonte
y
ser movidox
, e não uma cópia, como no seu último exemplo comentadow = v
. Como você especificaria isso?Copy
deve ser implementado para tipos "baratos", comou8
no exemplo. Se você escreve um tipo bastante pesado, para o qual considera que uma movimentação é mais eficiente que uma cópia, não implementeCopy
. Observe que, no caso do u8, você não pode ser mais eficiente com um movimento, pois, por baixo do capô, isso provavelmente implicaria pelo menos uma cópia indicadora - que já é tão cara quanto uma cópia do u8, então, por que se preocupar?Copy
característica afeta os escopos implícitos da vida útil das variáveis? Se sim, acho isso digno de nota.Como já coberto por outras respostas:
Copy
é implícito, barato e não pode ser reimplementado (memcpy).Clone
é explícito, pode ser caro e pode ser reimplementado arbitrariamente.O que às vezes falta na discussão de
Copy
vsClone
é que ele também afeta como o compilador usa movimentos versus cópias automáticas. Por exemplo:O primeiro exemplo (
PointCloneAndCopy
) funciona bem aqui por causa da cópia implícita, mas o segundo exemplo (PointCloneOnly
) com erro após o uso após a movimentação:Para evitar a mudança implícita, poderíamos ligar explicitamente
let p2 = p1.clone();
.Isso pode levantar a questão de como forçar uma movimentação de um tipo que implementa a característica de cópia? . Resposta curta: você não pode / não faz sentido.
fonte