2012-11-13 22 views
8

मैं boost::variant के कार्यान्वयन के बारे में उत्सुक हूं।बढ़ावा :: संस्करण कार्यान्वयन

क्या यह इस तरह काम करता है?

दो सदस्य:

  1. एक नंबर वर्तमान में संग्रहीत प्रकार (यानी 0 पहले टेम्पलेट पैरामीटर के लिए, 1 सेकंड टेम्पलेट पैरामीटर आदि के लिए)
  2. सभी संभव प्रकार के संघ (का प्रतिनिधित्व जो निश्चित रूप से सबसे बड़ा आकार)।

apply_visitor():

संख्या सही अधिभार कॉल करने के लिए वर्तमान में संग्रहीत प्रकार का प्रतिनिधित्व करने पर एक switch बयान (इस बदतर स्थिति में कूद तालिका के रूप में संकलित किया जाएगा ताकि निरंतर समय लेने के लिए) है।

मैं समझता हूं कि वहां कई अनुकूलन भी हैं जो सुनिश्चित कर सकते हैं कि boost::variant गतिशील रूप से विस्तृत here के रूप में स्मृति आवंटित करने की आवश्यकता नहीं है, लेकिन मुझे लगता है कि मुझे ये मिलता है।

+0

आप वास्तव में स्रोत कोड देख सकते हैं और यहां तक ​​कि दस्तावेज़ भी बता सकते हैं कि यह कैसे कार्यान्वित किया जाता है। मैं बफर की व्याख्या करने के तरीके को निर्धारित करने के लिए एक बफर (पर्याप्त प्रकार की चार सरणी) और एक टैग की अपेक्षा करता हूं। –

+1

अग्रिम में माफ़ी, लेकिन आपने स्रोत को देखा है, है ना? आपको यह पता लगाने में सक्षम होना चाहिए कि यह कैसे काम करता है, या तो स्रोतों का अध्ययन करके, या एक परीक्षण अनुप्रयोग का निर्माण और डीबगर के साथ कदम उठाने, नहीं? – Bukes

उत्तर

7

यह आपके द्वारा वर्णित तरीके से काफी काम करता है। लंबी कहानी कम:

  1. यह एक पूर्णांक which इंगित करता है कि जो डेटा प्रकार प्रयोग किया जाता है।

  2. स्टोरेज को बूस्ट के aligned_storage का उपयोग करके लागू किया गया है जो मूल रूप से अधिकतम डेटा आकार का बफर है। (यह एक संघ में है, लेकिन संरेखण प्रयोजनों के लिए)

अंत में, आगंतुक वास्तव में एक switch के साथ लागू किया, सभी प्रकार की संभावनाओं के लिए उतारना करने के लिए मैक्रो का उपयोग कर संकलन समय पर उत्पन्न होता है।

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