为什么Rust没有工会?

时间:2015-03-25 06:13:28

标签: rust

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

2 个答案:

答案 0 :(得分:43)

联盟已添加到(RFC 1444)中的语言中,并且从Rust 1.19.0起稳定。它们需要使用unsafe块。

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

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

答案 1 :(得分:25)

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

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

Foo可以有Bar附加i32Baz没有附加数据,Quux有这三个杂项字段。这是一个标记的联合 - 枚举的大小不会超过其变体的最大值加上标签所需的大小(通常是一个字节,但我想可能有更多的变体而不是一个字节),以及在某些情况下可以对其进行优化(例如Option<&T>,其内存地址为0对于Some变体不合法,因此可用于表示None变体)变体是挤进了价值。


Rust 所拥有的是未标记的联合,就像在C中一样。为什么?因为它们基本上是不安全的,安全对Rust来说至关重要。如果你仍然想要这样的东西,那么完全有可能围绕不安全的代码创建一个包装器,你将会遇到像嬗变这样的事情,但你在正常生活中根本不需要没有标记的联合。

Rust 确实现在支持未标记的联盟作为一个不安全的概念; as of 1.19.0