gpt4 book ai didi

rust - Rust 中有 POD 类型的概念吗?

转载 作者:行者123 更新时间:2023-11-29 07:44:29 25 4
gpt4 key购买 nike

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

A class [...] without constructors, destructors and virtual members functions.



Rust 中有类似的概念吗?

最佳答案

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

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

Copy性状 最接近 C++ 中的术语“POD 类型”,定义如下:

Types whose values can be duplicated simply by copying bits.



通过“复制位”,文档基本上意味着 memcpy() .这包括所有原始类型,例如 u32 , f32 , charbool ,但用户定义的类型可以是 Copy , 也。通常特征是简单的派生:
#[derive(Clone, Copy)]
struct Point {
x: f32,
y: f32,
}

您可能已经注意到 Clone : Clone traitCopy 的要求并定义为:

A common trait for the ability to explicitly duplicate an object.


Clone说一个类型“以某种方式能够复制自己”和 Copy需要更多的说法是类型“能够通过复制类型的位来复制自己”。

C++ 答案指出 POD 类型不包含“构造函数、析构函数和虚拟成员函数”。让我们为 Rust 分解一下:
  • 构造函数 :Rust 没有专用的构造函数方法,而是使用关联函数(C++ 中的静态方法)。每种类型,甚至所有 Copy类型,可以有任意多的关联函数和方法。在 Rust 中,并不是真正要求成为“POD”。特别是,即使是 Rust 的原始类型也有很多方法,比如 u32::pow() .此限制不适用于 Rust。
  • 析构函数 : 在 Rust 中,通过调用 drop() 来破坏对象来自 Drop trait(或者更确切地说:drop() 在作用域结束时自动调用)。 类型不能是 Copy当他们实现 Drop特征! Rust 在这里也有类似的限制。
  • 虚拟成员函数 :在 Rust 中,virtual 不是函数的属性。大多数函数都可以在虚拟上下文中使用,即:它们可以与动态调度一起使用,但是 Copy不会阻止类型在动态调度上下文中使用(在 Rust 术语中:用作特征对象)。这部分是由于 vptr 没有存储在类型中,而是在指向对象的指针(胖指针)旁边。这一点不适用于 Rust。


  • 但是,与“通过复制位进行复制”相比,您可能需要更多来自“POD 类型”的内容。 Rust 为一些附加属性内置了特定的 trait bound:
  • 'static : 要求类型不包含任何内部引用。例如,struct Foo<'a>(&'a u32);不会满足这个特征界限。如果你知道你的类型是 'static ,您没有终身限制,借用检查器不会给您带来任何问题。
  • Sized : 要求类型在编译时具有已知大小,因此可以存储在堆栈中。几乎所有类型都是如此;只有一些罕见的异常(exception):[T]str (切片),dyn MyTrait (特征对象)和包含未定义大小类型作为最后一个字段的结构(例如 Path )。
  • Send Sync :要求类型可以发送到其他线程,并且可以通过不可变引用( &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 )。

    关于rust - Rust 中有 POD 类型的概念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45634083/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com