2017-08-11 250 views

回答

6

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

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


Copy性状在C最接近于术语“POD类型” ++和定义如下:

类型,其值可以通过复制位简单地重复。

通过“复制位”,文档基本上是指memcpy()。这包括所有基元类型,例如u32,f32,charbool,但用户定义的类型也可以是Copy。通常的特点是简单衍生

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

你可能已经注意到了Clone:在Clone traitCopy要求,并定义为:

的明确复制能力的一个共同特点一个东西。

Clone说,一个类型是“在某种程度上能够复制自身”和Copy需要更多的说的类型是“能够通过仅仅复制型的位复制本身”。


C++答案指出POD类型不包含“构造函数,析构函数和虚拟成员函数”。让我们打破下来生锈:

  • 构造:铁锈没有专门的构造方法,而是使用相关功能(在C静态方法++)。每种类型,即使是所有类型,都可以拥有尽可能多的相关功能和方法。在Rust这并不是真正的“POD”要求。特别是,即使Rust的原始类型也有很多方法,如u32::pow()。此限制不适用于Rust。

  • 析构函数:拉斯特,目的是通过从Drop性状主叫drop()破坏(或更确切地说:drop()自动在范围结束调用)。 当他们实现Drop特性时,类型不能为Copy Rust在这里有类似的限制。

  • 虚拟成员函数:拉斯特,虚拟不是一个函数的性质。大多数函数都可以在虚拟环境中使用,即:它们可以与动态分派一起使用,但是Copy不会阻止某个类型在动态分派上下文中使用(以Rust术语:用作特征对象)。这部分要归功于vptr没有存储在类型中,而是指向对象的指针(胖指针)。这一点不适用于Rust。