अंतरिक्ष के लिए enum
एस के लेआउट को अनुकूलित करने के लिए संकलक बहुत स्मार्ट नहीं है। यह देखते हुए:
एक Option
तरह enum: एक ("nullary") कोई डेटा ले जाने के संस्करण है, एक संस्करण ठीक एक गृहीत युक्त
enum Option<T> { None, Some(T) }
enum Weird<T> { Nil, NotNil { x: int, y: T } }
enum Foo { A, B, C }
वास्तव में केवल एक ही मामला संकलक समझता है नहीं है। जब एक पॉइंटर के साथ उपयोग किया जाता है जिसे कभी शून्य नहीं माना जाता है (वर्तमान में, केवल संदर्भ और Box<T>
) प्रतिनिधित्व एक सूचक का होगा, नलिका संस्करण को इंगित करता है। एक विशेष मामले के रूप में, Weird
को एक ही उपचार प्राप्त होगा, लेकिन y
फ़ील्ड का मान यह निर्धारित करने के लिए किया जाएगा कि मूल्य किस प्रकार का प्रतिनिधित्व करता है।
इसके अलावा, कई संभावित अनुकूलन उपलब्ध हैं, लेकिन संकलक अभी तक उन्हें नहीं करता है। विशेष रूप से, आपका केस नहीं एक बाइट के रूप में प्रस्तुत किया जाएगा। एक enum के लिए, नेस्टेड मामले पर विचार नहीं, यह को सबसे छोटा पूर्णांक के रूप में प्रतिनिधित्व किया जा सकता है।
स्रोत
2014-06-22 22:56:29
rustc निश्चित रूप से enum प्रकारों के आकार को जानता है। वास्तव में, एक [लिंट] (https://github.com/rust-lang/rust/pull/14300) है जो चेतावनी देता है कि जब एक संस्करण आकार दूसरों की तुलना में काफी बड़ा होता है। लेकिन मुझे नहीं पता कि आपके प्रश्न में 'विकल्प' एक बाइट को अनुकूलित किया जाएगा या नहीं। –
edwardw
शायद यह 'विकल्प <~T>' जैसे पॉइंटर्स के लिए अनुकूलित किया गया है। –
[# 14540] (https://github.com/rust-lang/rust/issues/14540) को संकलक को इस अनुकूलन को जोड़ने के बारे में कुछ समय पहले दायर किया गया था (क्योंकि यह पूरी तरह से भाषा द्वारा अनुमत है)। – huon