2012-11-10 18 views
9

Evidentlyhold_anyboost::any से बेहतर प्रदर्शन है। यह ऐसा करने में कैसे प्रबंधन करता है?कैसे बढ़ावा देता है :: spirit :: hold_any काम करता है?

संपादित करें: मैट की टिप्पणी के लिए धन्यवाद, मुझे answer by hkaiserhold_any पर एक अन्य प्रश्न पर मिला लेकिन इसमें विवरणों की कमी है। एक और विस्तृत उत्तर का स्वागत किया जाएगा।

+0

क्या आपने उस आलेख से जुड़े स्टैक ओवरफ़्लो पोस्ट को पढ़ा था? – Mat

+1

क्या आपने मूल्य वर्टेंटिक छद्म पॉइंटर वर्गों के संदर्भ में "छोटे ऑब्जेक्ट ऑप्टिमाइज़ेशन मुहावरे" के बारे में सुना है, जैसे कि स्टडी स्ट्रिंग? – Yakk

उत्तर

1

मुझे लगता है कि कारणों में से एक कारण है क्योंकि boost :: hold_any एक टेम्पलेट मेटाप्रोग्रामिंग दृष्टिकोण का उपयोग करता है जबकि बढ़ावा देता है :: कोई विरासत दृष्टिकोण का उपयोग करता है।

आंतरिक रूप से, को बढ़ावा देने :: भावना :: hold_any भंडार "मूल्य" एक शून्य * का उपयोग करने और किसी अन्य वस्तु का उपयोग करता है डेटा प्रकार की जानकारी का ट्रैक रखने के:

>> boost/spirit/home/support/detail/hold_any.hpp 
template <typename Char> 
class basic_hold_any 
{ 
    .... 
    spirit::detail::fxn_ptr_table<Char>* table; 
    void* object; 
    ... 
} 

बढ़ावा :: किसी भी स्टोर "मूल्य "धारक का उपयोग करके, और डेटा प्रकार की जानकारी का ट्रैक रखने के लिए इसे किसी अन्य ऑब्जेक्ट की आवश्यकता नहीं है। धारक को प्लेसहोल्डर से विरासत में मिला है और इसके परिणामस्वरूप विरासत में कमी आती है।

>> boost/any.hpp 
class any 
{ 
    ... 
    placeholder * content; 
    ... 
} 


class placeholder 
template<typename ValueType> 
class holder : public placeholder 
{ 
    ... 
    ValueType held; 
    ... 
} 

... कार्यक्षमता अंतर निर्माणकर्ता और विनाशकर्ता बुला के बारे में भी बहुत कुछ है, लेकिन फिर भी कास्टिंग के लिए, को बढ़ावा देने :: भावना :: hold_any तेजी से होना चाहिए।

1

होल्ड_नी दो अनुकूलन करता है: 1. छोटी वस्तुओं के लिए यह ऑब्जेक्ट धारक के लिए स्मृति आवंटित नहीं करता है लेकिन इसे सीधे सूचक स्मृति में संग्रहीत करता है; 2. यह आरटीटीआई प्रकार की तुलना (जो धीमा है) का उपयोग नहीं करता है, लेकिन अपनी खुद की टाइप टेबल

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