2014-06-22 4 views
5

मान लें कि हमारे पास enum Foo { A, B, C } है।विकल्प <T> है जब टी इसे अनुमति देता है तो एक बाइट को अनुकूलित किया जाता है?

क्या Option<Foo> इस मामले में एक बाइट को अनुकूलित किया गया है?

बोनस प्रश्न: यदि हां, तो अनुकूलन प्रक्रिया की सीमाएं क्या हैं? Enums घोंसला जा सकता है और अन्य प्रकार शामिल हैं। क्या संकलक हमेशा अधिकतम संयोजनों की गणना करने में सक्षम होता है और फिर सबसे छोटा प्रतिनिधित्व चुनता है?

+0

rustc निश्चित रूप से enum प्रकारों के आकार को जानता है। वास्तव में, एक [लिंट] (https://github.com/rust-lang/rust/pull/14300) है जो चेतावनी देता है कि जब एक संस्करण आकार दूसरों की तुलना में काफी बड़ा होता है। लेकिन मुझे नहीं पता कि आपके प्रश्न में 'विकल्प ' एक बाइट को अनुकूलित किया जाएगा या नहीं। – edwardw

+0

शायद यह 'विकल्प <~T>' जैसे पॉइंटर्स के लिए अनुकूलित किया गया है। –

+0

[# 14540] (https://github.com/rust-lang/rust/issues/14540) को संकलक को इस अनुकूलन को जोड़ने के बारे में कुछ समय पहले दायर किया गया था (क्योंकि यह पूरी तरह से भाषा द्वारा अनुमत है)। – huon

उत्तर

3

अंतरिक्ष के लिए 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 के लिए, नेस्टेड मामले पर विचार नहीं, यह को सबसे छोटा पूर्णांक के रूप में प्रतिनिधित्व किया जा सकता है।

संबंधित मुद्दे