如果类型也实现了Copy,则Copy的文档概述了Clone实现的要求

CloneCopy的一个超特性,所以所有的Copy都必须实现Clone.如果一个类型是Copy,那么它的Clone实现只需要返回*self(参见上面的示例).

这很容易在代码审查或使用clippy中判断,但我想知道是否也可以编写测试来判断它.

我的第一个 idea 是,由于Copy是一个简单的逐位复制,我可以判断一个引用的字节内容,assert_eq!(bit_contents(&t), bit_contents(&t.clone())).然而,我认为bit_contents可能是潜在的不健全的,因为 struct 可能有未初始化的内存(如果它包含unionenum的较小变体).

我的理解正确吗?是否有其他方法可以确保Clone trait在T: Copy中正确实现?

(这个问题主要是为了理解Rust的内存处理,出于实际目的,我很高兴只使用clippy lint)

推荐答案

是的,读取填充字节是未定义的行为,即使没有(例如,您使用内联汇编或调用memcmp()进行比较),填充字节也不会初始化,这意味着编译器可以自由地不复制它们,这将导致填充字节的值不同,从而导致比较失败.

据我所知,除了提供递归比较所有原始字段的派生宏之外,没有办法在Rust中测试这一点.

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

将JSON密钥转换为Polars DataFrame

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

使用Py03从Rust调用Python函数时的最佳返回类型

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

如何go 除多余的(0..)在迭代中,当它不被使用时?

将一个泛型类型转换为另一个泛型类型

我们能确定Rust会优化掉Clone()吗?如果它会立即掉落?

Rust中WPARAM和VIRTUAL_KEY的比较

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

push 方法是否取得所有权?

bcrypt 有长度限制吗?

为什么拥有 i32 所有权的函数需要它是可变的?

发生移动是因为 `data` 的类型为 `Vec`,它没有实现 `Copy` 特性

如何从 many0 传播 Nom 失败上下文?

如何在不设置精度的情况下打印浮点数时保持尾随零?