2014-10-02 7 views
9

बूस्ट :: संस्करण एक विविध कंटेनर को प्रकार के एक विषम सेट में हेरफेर करने के लिए लगता है। मैं इसकी लागत सोच रहा हूँ। स्मृति में, मुझे लगता है कि यह सबसे बड़ा प्रकार और एक पूर्णांक का आकार लेता है जो प्रतिनिधित्व करता है()। Apply_visitor() के लिए, मुझे लगता है कि इसका प्रदर्शन बहुत अच्छा है, यह सीधे बहुत सारे ifs के अलावा फ़ंक्शन को कॉल कर सकता है। क्या मेरे अंक सही हैं?बूस्ट :: संस्करण स्मृति और प्रदर्शन लागत क्या है?

+0

बूस्ट opensource है। आप थोड़ा सा शोध कर सकते हैं और स्रोत कोड ब्राउज़ कर सकते हैं। ऐसा लगता है कि आप पहले ही जानते हैं कि क्या देखना है। – Drop

+2

'apply_visitor' हुड के नीचे" बहुत सारे ifs "करता है (वास्तव में यह संस्करण (' (() ') प्रकार के प्रकार (',()') पर एक (बड़ा, मेटाप्रोग्राम) स्विच की तरह है। जाहिर है, यह केवल न्यूनतम काम आवश्यक है।) – sehe

उत्तर

11

आप लगभग सही हैं।

boost::variant के आकार है किसी भी तत्व का अधिकतम आकार है, को गिरफ्तार के रूप में सबसे बड़ा संरेखण, प्लस कुछ पूर्णांक के आकार के लिए आवश्यक है, और फिर इकट्ठे हो।

सोचो इन प्रकार का एक संस्करण के बारे में, टैग संभालने uint32_t है:

struct foo { uint32_t value[3]; }; // size 12, align 4 
struct bar { uint64_t v2; }; // size 8, align 8 

एक टैग नहीं किए गए यूनियन, आकार 16 होना चाहिए 8 संरेखित; 4 बाइट टैग जोड़ने संरेखित रखने 8.

या का एक प्रकार पर विचार करने के आकार 24 तक जा चाहिए:

struct foo { uint8_t value[5]; }; // size 5, align 1 
struct bar { uint16_t v2; }; // size 2, align 2 

इनमें से एक टैग नहीं किए गए यूनियन आकार 6 होना आवश्यक है, संरेखित 2; 4-बाइट टैग आपको आकार 12 के लिए मजबूर करता है, 0 को संरेखित करें।

कॉल करने के लिए, मुझे उम्मीद है कि यह एक सरणी-कार्य-फ़ंक्शन लुकअप का उपयोग करता है (इस तरह मैंने अपने स्वयं के संस्करण को कार्यान्वित किया, जो कि जरूरी था क्योंकि बूस्ट ने नहीं किया था सपोर्ट कन्स्ट्रक्टर का समर्थन करें), क्योंकि यदि चेन अच्छी तरह से प्रदर्शन नहीं करते हैं और स्विच असंभव हैं।

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