如果可能,是否应始终实施复制特征?

时间:2017-09-12 21:17:28

标签: copy rust move

您可以实现Copy特征来赋予类型copy-semantics而不是move-semantics。只有当其所有组成元素(产品类型的每个因素或和类型的每个变量的每个因子)也是Copy时,才能执行此操作。

这使您可以制作相当大的类型Copy。如果类型的大小是“大”,那么实施Copy是否会对性能产生不利影响?

如果始终要实现Copy,为什么它不是SyncSend这样的自动特征,对于那些可以实现它并具有选择退出语义而非选择的类型-in?

1 个答案:

答案 0 :(得分:8)

  

为什么[Copy]不是SyncSend这样的自动特征,对于那些可以实现它并具有选择退出语义而不是选择加入的类型?

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

  

如果可能,是否始终实施Copy特征?

不一定。在开发库时,在类型上实现Copy或不实现的选择会影响前向兼容性。删除类型上的Copy实现是一个重大变化(该类型的用户可能依赖于被复制而不是移动的类型),因此会对库施加主要版本冲突以尊重{{ 3}}。特别是,如果某个类型现在能够实现Copy,但您认为该类型可能会发展为无法再实现Copy,那么您应该安全地使用它,而不是在该类型上实施Copy

正如您所提到的,未实现Copy的另一个原因是大型类型。对于此类类型仅实施Clone可能很有用,通常" Clone但不是Copy"表示克隆该值并不便宜"。但是,即使类型不是Copy,也只能通过移动值来导致大量的内存复制操作(尽管如果你很幸运,编译器可能会优化它)。

  

如果类型的大小是"大"那么实施Copy是否会对性能产生不利影响?

如果您从未对该类型执行复制,请勿使用!请记住, move copy 之间的唯一区别是,移动会使源无法使用(例如,如果您尝试使用值,编译器将引发错误移动后),虽然副本没有;这两个操作都实现为浅存储器副本。

相关问题