Rust中有POD类型的概念吗?

时间:2017-08-11 11:26:58

标签: rust

在C ++中,术语 POD类型用于描述仅包含普通旧数据的类型。 Quoted from here

  

没有构造函数,析构函数和虚拟成员函数的类[...]。

Rust中有类似的概念吗?

1 个答案:

答案 0 :(得分:11)

快速回答; C ++的POD类型≈Rust' s Copy types

但是,还有一些其他相关的概念。让我们详细讨论它们!

Copy特质最接近术语" POD类型"在C ++中,定义如下:

  

只需复制位即可复制其值的类型。

通过"复制位",文档基本上意味着memcpy()。这包括所有原始类型,例如u32f32charbool,但用户定义的类型也可以是Copy。通常,特征只是派生的

#[derive(Clone, Copy)]
struct Point {
    x: f32,
    y: f32,
}

您可能已注意到CloneClone traitCopy的要求,定义为:

  

显式复制对象的能力的常见特征。

Clone说类型是"以某种方式能够复制自己"并且Copy需要更多,通过说类型是"能够通过复制类型的位来复制自己"。

C ++回答指出POD类型不包含"构造函数,析构函数和虚拟成员函数"。让我们为Rust打破这个:

  • 构造函数:Rust没有专用的构造函数方法,而是使用相关的函数(C ++中的静态方法)。每种类型,甚至所有Copy类型,都可以拥有任意数量的相关函数和方法。在Rust中,并不是要求成为" POD"。特别是,甚至Rust的原始类型也有很多方法,比如u32::pow()。此限制不适用于Rust。

  • 析构函数:在Rust中,通过从Drop特征调用drop()来破坏对象(或者更确切地说:drop()会自动调用范围结束)。 类型在实施Copy特征时不能Drop Rust在这里有类似的限制。

  • 虚拟成员函数:在Rust中,虚拟不是函数的属性。大多数函数可以在虚拟上下文中使用,即:它们可以与动态调度一起使用,但Copy不能阻止在动态调度中使用类型上下文(在Rust术语中:用作特征对象)。这部分归功于vptr不存储在类型中,而是存储在指向对象的指针旁边(胖指针)。这一点并不适用于Rust。

但是,您可能需要更多来自" POD类型"通过复制比特来复制#34; Rust具有内置的特定特征边界,用于其他一些属性:

  • 'static :要求该类型不包含任何内部引用。例如,struct Foo<'a>(&'a u32);不满足此特征限制。如果您知道自己的类型为'static,则您没有终身限制,借阅检查工具不会让您遇到任何问题。

  • Sized:要求类型在编译时具有已知的大小,因此可以存储在堆栈中。几乎所有类型都是如此;只有少数罕见的例外:[T]str(切片),dyn MyTrait(特征对象)和包含未定义类型作为最后一个字段的结构(例如{{3 }})。

  • PathSend:要求可以将类型发送到其他线程,并且可以跨线程通过不可变引用(&T)共享。两种特征都适用于几乎所有类型。如果类型包含某种魔法(例如Syncinterior mutability,...),则无法实现。要求这两个特质界限确保你的类型没有这种魔力。

所以,如果你真的想要一个非常简单,没有魔法的包#34;输入,这似乎是一个合适的特征/边界集合:

trait Pod: 'static + Copy + Sized + Send + Sync {}

impl<T: 'static + Copy + Sized + Send + Sync> Pod for T {}

使用这些类型,您不会处理移动语义(由于Copy)或借用检查器(由于'static)。