根据BYTEMUCK的DOC here,Pod
只是一个标记性状.其定义如下:
pub unsafe trait Pod: Zeroable + Copy + 'static { }
我对"标记特征"的理解是:它的目的是声明某些类型具有一些无法用函数/方法描述的特征(这里我指的是英语中的"特征",它是"特征"的同义词).通过这种方式,其他人(特别是这些类型的消费者)知道如何正确处理这些类型.例如,Copy
是一个标记性状.当将一个类型标记为Copy
时,Rust编译器知道当为该类型处理a = b
时,它应该执行按位复制.Send
也是一个标记性状.在标记时,编译器知道此类型可以被发送到另一个线程.
回到Pod
美元.如果我声明我的类型是Pod
,为什么我至少要把我的类型变成Copy
?当我将我的类型标记为Pod
时,我对bytemuck
说:"嘿,我的类型是Pod
.毫无疑问,你可以相信我.我的类型绝对是Pod
.你现在可以将一些字节重新解释为我的类型."
是因为bytemuck
希望确保任何包含非Copy
类型的类型都不能被标记为Pod
吗?因为"A类型是Copy
"确实是"A类型是Pod
"的necessary but not sufficient condition(毕竟,如果一个类型甚至不是Copy
,那么它怎么可能是普通的旧数据).例如,通过这种方式,开发人员不会意外地在定制 struct 中包含非Copy
类型(如Vec<u8>
和String
).
如果这真的是原因,我还是很困惑.我仍然需要将一个非常大的字体标记为Copy
,才能将其标记为Pod
.下面的 struct 是一个示例.
struct MyStruct {
data: [u8; 10_000_000],
}
这有点荒谬.如果我意外地触发了此类型的按位复制,该怎么办?
不把Copy
作为Pod
的超级性状难道不是更好的主意吗?我(作为代码作者)将对我标记为Pod
的每一种类型承担全部责任.