2015-03-25 51 views

回答

29

將聯盟添加到(RFC 1444)中的語言中,並且從Rust 1.19.0開始穩定。他們需要使用unsafe塊。

原始聯合不是內存安全的(因爲編譯器無法保證始終從聯合中讀取正確類型(即最近寫入的類型))。 Rust的目標之一是創建一個具有記憶安全性的低級語言;由於工會與此目標不兼容,因此他們未包含在Rust 1.0中。

相反,Rust有enums,它提供了工會的大部分優點,以換取較小的內存使用量,但由於枚舉值始終跟蹤其包含的特定類型,因此它們是內存安全的。

+1

實際上這是[目前制定的](https://github.com/rust-lang/rust/pull/36016),用於extern C兼容性。 – snuk182 2016-09-01 20:44:24

21

鏽病已在其代數數據類型的形式標籤聯合enum

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

Foo有可以是Bar具有附接的i32,一個Baz沒有額外的數據或Quux與這三個雜項領域。這是一個帶標記的聯合 - 枚舉的大小不會超過其變體中最大的變量加上標籤所需的大小(通常爲一個字節,但我想可能有更多的變體比適合一個字節),以及在某些情況下,它可以進行優化(如Option<&T>,其中內存地址0對於Some變體不合法,因此可以用來表示None變體),變體被壓縮到該值。


鏽做些什麼有是未標記工會爲C.爲什麼?因爲它們基本上是不安全的,安全對於Rust來說是最重要的。如果你仍然需要類似的東西,那麼完全有可能爲不安全的代碼創建一個包裝,這些代碼將隨着轉換髮生,但在普通生活中你根本不需要未標記的聯合。

現在支持未標記的工會作爲一個不安全的概念; as of 1.19.0

+3

即使您只有兩個變體(例如'enum X {S(i32),U(u32)}'是八個字節),由於對齊,該標記可以大於一個字節。從技術上講,它是一個三字節填充字節,但最終結果是一樣的。 – delnan 2015-03-25 08:26:07

相關問題