なぜそれを実装し、オプトアウトのセマンティクスの代わりにオプトインを持つことができ、これらのタイプのSync
とSend
のような[Copy
]ない自動特色がありますか?
Copy
は、それを実装できるタイプによって自動的に実装されていました。この動作はin December 2014に変更されました。
可能であれば、Copy
特性を常に実装する必要がありますか?
必ずしもそうである必要はありません。ライブラリを開発する場合、タイプにCopy
を実装するかどうかは、前方互換性に影響します。あるタイプのCopy
実装を削除することは大きな変更です(そのタイプのユーザは、移動する代わりにコピーするタイプに依存する可能性があります)。そのため、semantic versioningを尊重するためにライブラリにメジャーバージョンのバンプが適用されます。特に、タイプがCopy
を今実装できる場合、タイプが進化してCopy
を実装できなくなる可能性があると思われる場合は、安全に再生し、そのタイプにCopy
を実装しないでください。
Copy
を実装しないもう一つの理由は、前述したように大きなタイプです。通常、「Clone
ではCopy
ではない」という値は、値のクローン作成が「安い」ではないことを示しているため、このようなタイプにはClone
しか実装しないと便利です。しかし、型がCopy
でなくても、単に値を移動するだけで、大きなメモリコピー操作が発生する可能性があります(ただし、幸運なことに、コンパイラはそれを最適化するかもしれません)。
Copy
を実装すると、タイプのサイズが「大きい」場合はパフォーマンスに悪影響を及ぼすことがありますか?
タイプでコピーを実行しない場合は、 の唯一の違いは、とのコピーの唯一の違いは、移動によってソースが使用できなくなることです(つまり、移動後に値を使用しようとするとコンパイラがエラーを発生させます) 't;両方の操作は、浅いメモリコピーとして実装されます。
[私のタイプはいつコピーするべきですか](https://doc.rust-lang.org/stable/std/marker/trait.Copy.html#when-should-my-type-be-copy) – ljedrz