当前位置: 首页 > 知识库问答 >
问题:

为什么铁锈没有工会?

嵇出野
2023-03-14

我可以想到许多地方,C语言中的联合有助于节省内存。因为Rust是一种系统编程语言,为什么它不支持联合呢?

共有2个答案

松英喆
2023-03-14

Rust以代数数据类型的形式标记了联合体,enum

enum Foo {
    Bar(i32),
    Baz,
    Quux {
        misc: A,
        ellaneous: B,
        fields: C,
    },
}

一个Foo可以是一个带有附加i32Bar,一个没有附加数据的Baz,或者一个带有这三个杂项字段的qux。这是一个带标记的联合。枚举的大小不会超过其最大的变量加上标记所需的数量(通常为一个字节,但我想可能有更多的变量超过一个字节),并且在某些情况下可以对其进行优化(如选项)

Rust没有的是C中的无标记联合。 为什么?因为它们根本不安全,安全对铁锈来说至关重要。如果您仍然想要这样的东西,那么完全有可能围绕不安全的代码创建一个包装器,这样您就可以在变形发生时获得这些代码,但是在正常生活中您根本不需要无标记的联合。

Rust现在支持无标记联合作为不安全的概念;从1.19.0开始。

张亦
2023-03-14

联合在(RFC 1444)中被添加到语言中,并且它们在Rust 1.19.0中是稳定的。它们需要使用不安全的块。

原始联合不是内存安全的(因为编译器无法保证您始终从联合中读取正确的类型(即最近编写的类型)。Rust的目标之一是创建一种具有记忆安全性的低级语言;由于工会与该目标不兼容,因此它们未包含在Rust 1.0中。

相反,Rust有枚举,它提供了联合的大部分优点,以换取较小的内存使用,但它是内存安全的,因为枚举值始终跟踪它包含的特定类型。

 类似资料:
  • 我正在尝试制作VGA文本动画的操作系统,但它的处理速度非常快。 所以,我想做“等待”功能,每次等待100毫秒,但我不知道如何不用std板条箱。 那么问题是,我如何在没有性病的情况下睡觉/等待生锈? 谢谢

  • 在铁锈书里有一个关于音频编码器的有趣例子:比较性能:循环和迭代器 > 此外,压缩时,它将系数中的当前项配对--并与配对,这同样没有意义,因为我不知道如何将索引和子列取为类似。 欢迎任何帮助!

  • 我以前使用过: 要创建对象,请执行以下操作: 然而,这似乎不再有效。编译器报告: 宏定义发生了什么变化,使其不再工作? 下面的基本示例效果良好: 这似乎是对{T:ident,$(…),}的一些改变是否正在处理扩展? 这到底是怎么回事?

  • 问题内容: 我正在尝试做这样的事情: 不幸的是,即使在Java 9中也不存在。 为什么它被遗漏了? 建议的解决方法是什么? 问题答案: 为什么它被遗漏了? 该API提供了可重用的构建块。这里的相关积木是,,。通过这些,您可以实现所需的功能:将流内映射到对象,然后获得平面图。提供构建基块的排列是不切实际的,并且很难扩展。 建议的解决方法是什么? 如前所述,使用可用的构建基块(+ ):

  • 许多编译器都提供128位整数类型,但我使用过的编译器都没有提供typedefs。为什么? 据我回忆,标准 用于此目的的储量 鼓励提供此类类型的实现提供typedef 要求此类实现提供至少128位的intmax_t (而且,我不相信我使用了实际上符合最后一点的实现)