我可以想到许多地方,C帮助中的工会是有用的,它们可以节省内存。由于Rust是一种系统编程语言,为什么它不支持联合?
答案 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
附加i32
,Baz
没有附加数据,Quux
有这三个杂项字段。这是一个标记的联合 - 枚举的大小不会超过其变体的最大值加上标签所需的大小(通常是一个字节,但我想可能有更多的变体而不是一个字节),以及在某些情况下可以对其进行优化(例如Option<&T>
,其内存地址为0对于Some
变体不合法,因此可用于表示None
变体)变体是挤进了价值。
Rust 所拥有的是未标记的联合,就像在C中一样。为什么?因为它们基本上是不安全的,安全对Rust来说至关重要。如果你仍然想要这样的东西,那么完全有可能围绕不安全的代码创建一个包装器,你将会遇到像嬗变这样的事情,但你在正常生活中根本不需要没有标记的联合。
Rust 确实现在支持未标记的联盟作为一个不安全的概念; as of 1.19.0