我可以想到許多C工會中的工會都很有用的地方,他們可以節省內存。由於Rust是一種系統編程語言,它爲什麼不支持聯合?Rust爲什麼沒有工會?
回答
將聯盟添加到(RFC 1444)中的語言中,並且從Rust 1.19.0開始穩定。他們需要使用unsafe
塊。
原始聯合不是內存安全的(因爲編譯器無法保證始終從聯合中讀取正確類型(即最近寫入的類型))。 Rust的目標之一是創建一個具有記憶安全性的低級語言;由於工會與此目標不兼容,因此他們未包含在Rust 1.0中。
相反,Rust有enums,它提供了工會的大部分優點,以換取較小的內存使用量,但由於枚舉值始終跟蹤其包含的特定類型,因此它們是內存安全的。
鏽病已在其代數數據類型的形式標籤聯合,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。
即使您只有兩個變體(例如'enum X {S(i32),U(u32)}'是八個字節),由於對齊,該標記可以大於一個字節。從技術上講,它是一個三字節填充字節,但最終結果是一樣的。 – delnan 2015-03-25 08:26:07
- 1. Rust爲什麼沒有在多語句宏中找到變量?
- 2. 爲什麼Rust在讀取循環後沒有看到變量?
- 3. 爲什麼這也會返回沒有
- 4. 爲什麼PyLint會提示沒有__init__?
- 5. 如果沒有匹配,使用「匹配」的Rust會發生什麼?
- 6. 爲什麼沒有@ event.users.size工作?
- 7. 爲什麼我的CSS沒有工作?
- 8. 爲什麼這個mod_rewrite沒有工作?
- 9. 爲什麼我的OpenFileDialog沒有工作?
- 10. 爲什麼`list :: iterator + 1`沒有工作?
- 11. 爲什麼沒有(cell == nil)工作?
- 12. 爲什麼SpriteKit PhysicContactDelegate沒有工作?
- 13. Angular2 RxJS爲什麼map()沒有工作?
- 14. 爲什麼沒有工作RTCPeerConnection icegatheringstatechange?
- 15. PHP爲什麼preg_match沒有工作?
- 16. 綁定工作沒有INotifyPropertyChanged,爲什麼?
- 17. getJSON - 爲什麼它沒有工作?
- 18. 爲什麼這個Makefile沒有工作?
- 19. 爲什麼我的`array_intersect`沒有工作?
- 20. 爲什麼CheckBoxFieldWidget沒有工廠?
- 21. 爲什麼沒有這個殼工作
- 22. 。爲什麼沒有聲明工作?
- 23. 爲什麼qName工作和LocalName沒有?
- 24. 爲什麼工具欄沒有提升?
- 25. c/C++爲什麼有時會強調爲什麼有時沒有下劃線?
- 26. Rust完全沒有增量編譯意味着什麼?
- 27. Rust的`String`和`str`有什麼區別?
- 28. 爲什麼我會有沒有會員錯誤
- 29. 爲什麼在Rust官方庫中沒有單獨鏈接的列表?
- 30. 什麼是String.iter()在Rust中做什麼?
實際上這是[目前制定的](https://github.com/rust-lang/rust/pull/36016),用於extern C兼容性。 – snuk182 2016-09-01 20:44:24