如果可能,是否应该始终实现 Copy 特性?

Should the Copy trait always be implemented if possible?

您可以实现 Copy 特征来赋予类型复制语义而不是移动语义。仅当其所有组成元素(产品类型的每个因素,或总和类型的每个变体的每个因素)也都是 Copy.

时才能这样做

这还允许您制作相当大的类型 Copy。如果类型的大小为 "large",实现 Copy 是否会对性能产生不利影响?

如果 Copy 应该始终被实现,为什么它不是像 SyncSend 这样的自动特征,对于那些可以实现它并具有选择退出语义的类型选择加入?

why is [Copy] not an auto-trait like Sync and Send for those types which can implement it and have opt-out semantics instead of opt-in?

Copy 过去是由可以实现它的类型自动实现的。此行为已更改 in December 2014,在 Rust 1.0 之前不久。

Should the Copy trait always be implemented if possible?

不一定。在开发库时,选择是否在类型上实现 Copy 会影响向前兼容性。删除类型上的 Copy 实现是一个重大更改(该类型的用户可能依赖于被复制而不是移动的类型),因此会在库上强加一个主要版本 bump 以尊重 semantic versioning。特别是,如果一个类型现在能够实现 Copy,但您认为该类型可能会进化到无法再实现 Copy,您应该谨慎行事,不要实现 [=10] =] 在那个类型上。

如您所述,未实施 Copy 的另一个原因是大型类型。对于此类类型,仅实现 Clone 可能很有用,因为通常“Clone 但不是 Copy” 表示克隆值不是 "cheap"。然而,即使一个类型不是 Copy,仅仅移动值仍然可能导致大量内存复制操作(尽管如果幸运的话,编译器可能会优化它)。

Can implementing Copy be detrimental to performance if the size of the type is "large"?

如果您从不对该类型执行复制,则不会!请记住,movecopy 之间的唯一区别是移动会使源不可用(即如果您尝试在移动后使用一个值),而副本则不会;这两个操作都是作为浅内存副本实现的。