快速回答; C ++的POD类型≈锈病的Copy
types。
不过,也有一些其他的,相关的概念。让我们来讨论他们在细节!
所述Copy
性状是用C最接近于术语“POD类型” ++并且被定义为如下:
类型,它们的值可以通过复制位简单地重复。
通过“复制位”,文档基本上意味着memcpy()
。这包括所有的原始类型,如u32
,f32
,char
和bool
,但用户定义的类型可以是Copy
,太。通常的特点是简单地得出:
#[derive(Clone, Copy)]
struct Point {
x: f32,
y: f32,
}
你可能已经注意到了Clone
:在Clone
trait是Copy
的要求,被定义为:
为明确地复制对象的能力的共同特点。
Clone
说,一个类型是“在某种程度上能够复制自身”和Copy
需要更多的说的类型是“能够通过仅仅复制型的位复制本身”。
C ++的回答POD类型不包含“构造函数,析构函数和虚拟成员函数”的状态。让我们打破下来生锈:
Copy
类型,可能有多达相关的函数和方法。在锈它是不是真的是“POD”的要求。特别是,即使锈病的原始类型有很多方法,如u32::pow()
。此限制并不适用于生锈。drop()
性状主叫Drop
破坏(或更确切地说:drop()
被自动调用在范围的端部)。类型不能Copy
当他们执行Drop
特质!拉斯特这里也有类似的限制。Copy
不会阻止从类型以动态调度上下文中使用(在防锈方面:被用作性状对象)。这部分要归功于vptr的没有存储在类型中,但旁边的指向对象(脂肪指针)的事实。这一点并不适用于生锈。然而,你可能需要从你的“POD类型”更多的东西比“是通过复制位可复制”。锈有内置的,特定性状界一些额外的属性:
'static
:要求类型不包含任何内部引用。例如,struct Foo<'a>(&'a u32);
并不能满足这一特质的约束。如果你知道你的类型是'static
,你有没有一辈子的限制,借检查不会让你的任何问题。Sized
:要求类型具有在编译时已知的尺寸,因此可以存储在栈上。对于几乎所有类型的是真实的;只有极少数肥胖型异常:[T]
和str
(切片),dyn MyTrait
(性状对象),而且含有未施胶类型作为最后一个字段(例如Path
)结构。Send
和Sync
:要求的类型可以发送到其他线程,并且可以通过在线程不可变的参考(&T
)共享。这两个性状的几乎所有类型的实现。如果类型包含某种魔力它没有实现(例如interior mutability,references to something without having a lifetime,...)。需要这两种特质边界可以确保你的类型没有这个魔术。所以,如果你真的想类型非常简单,没有魔法“的位袋”,这似乎是一个合适的特质/收藏界:
trait Pod: 'static + Copy + Sized + Send + Sync {}
impl<T: 'static + Copy + Sized + Send + Sync> Pod for T {}
有了这些种类型的,你不会处理移动语义(由于Copy
)或借位检查(由于'static
)。