< 返回我的博客

爱国的张浩予 发表于 2021-07-18 22:14

Tags:rust,copy,clone

CopyClone trait的区别与关联

  1. 从继承层次来讲,CloneCopySupertrait。因此,所有Copy类型也一定是Clone类型。

  2. 从被复制的内容来讲,Copy仅只对【栈】内存做【按位复制】,而不对任何【堆】内存负责。而,Clone需要对复本的整体有效性负责,所以【栈】与【堆】都是Clone的复制目标。由此可知,StringVec<T>皆为!Copy的原因是:它们保存的数据主体都在【堆】上;而【栈】上仅有它们的一对智能指针。因此,CopyStringVec<T>完全没有意义。

  3. 从复制行为的定义来讲,Copy【按位复制】的技术细节是完全被密封在rustc内。开发者基本没有办法介入与定制,仅只能通过给类实现Copy marker trait来暗示rustc对此类实例做【按位复制】。另一方面,Clone的所有操作细节都必须由开发者在Clone::clone(&self)成员方法的实现内明确地指定。这算是将业务定制权全面下放给开发者了。所以,rust也不从语言层面保证Clone行为的执行效率。相反,这应该是开发者自己担负的事。

  4. 从复制行为的触发时机,Copy行为在【(1)赋值(2)参数传入(3)结果传出】时被【隐式】地触发。而,Clone行为必须经由Clone::clone(&self)成员方法调用来【显示】地触发。后者明显更直观一些,也少了许多的“黑魔法”。

  5. trait实现的技术限制来讲,Copy trait的实现约束比较苛刻,包含两条:

    1. 类的所有成员都是Copy的。“成员(member)”的含义取决于类型,例如:结构体的字段、枚举的变量、数组的元素、元组的项,等等。
    2. 类没有实现Drop trait。即,!Drop类型。因为Drop类实例的内容主体一般不在【栈】上。要么像 String,其关键数据存在【堆】上;要么,类似于【数据库连接】,其关键数据在操作系统上。而仅只复制一个智能指针真没有意义。

    另一方面,Clone trait 对实现类几乎没有任何的限制。一切皆由着开发者来;一切也皆由开发者好自为之。

评论区

写评论
Mike Tang 2021-07-19 23:01

赞,到时给你笔记汇总一下,公众号推一把

1 共 1 条评论, 1 页