有POD类型的锈一个什么概念?

问题描述 投票:9回答:1

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

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

是否有锈类似的概念?

rust
1个回答
11
投票

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

不过,也有一些其他的,相关的概念。让我们来讨论他们在细节!


所述Copy性状是用C最接近于术语“POD类型” ++并且被定义为如下:

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

通过“复制位”,文档基本上意味着memcpy()。这包括所有的原始类型,如u32f32charbool,但用户定义的类型可以是Copy,太。通常的特点是简单地得出:

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

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

为明确地复制对象的能力的共同特点。

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


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

  • 构造函数:锈不具有专用构造方法,而是使用相关联的功能(在C静态方法++)。因为他们希望每一个类型,甚至是所有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)结构。
  • SendSync:要求的类型可以发送到其他线程,并且可以通过在线程不可变的参考(&T)共享。这两个性状的几乎所有类型的实现。如果类型包含某种魔力它没有实现(例如interior mutabilityreferences 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)。

© www.soinside.com 2019 - 2024. All rights reserved.