2017-04-13 8 views
12

llvm::SmallVector<T,N> के कार्यान्वयन कई प्रकार के बीच विभाजित है:क्यों llvm :: SmallVector अपने भंडारण को विभाजित करता है?

  • llvm::SmallVectorBase, शुरू अंत में, और क्षमता के लिए रखती है 3 void* रों।
  • llvm::SmallVectorTemplateCommon<T>पहले छोटे भंडारण के तत्व को रखता है, उचित रूप से गठबंधन और आकार char सरणी के रूप में।
  • llvm::SmallVector<T,N> उचित भंडारण के आकार N-1 तत्वों को उचित रूप से गठबंधन और char सरणी के आकार के रूप में रखता है।

क्यों है दो वर्ग टेम्पलेट्स के बीच भंडारण विभाजन, के रूप में आधार वर्ग के लिए नीचे सबसे व्युत्पन्न वर्ग (SmallVector<T,N>) बस सभी N तत्वों की दुकान है और इस भंडारण की ओर इशारा में पास होने के लिए विरोध किया? यही कारण है, जहां वर्तमान में डिफ़ॉल्ट निर्माता करता है:

SmallVector() : SmallVectorImpl<T>(N) { } 

एक काल्पनिक विभिन्न कार्यान्वयन कर सकता है:

SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { } 

और SmallVectorTemplateCommonFirstEl सदस्य नहीं होगा। कार्यान्वयन का क्या फायदा है क्योंकि यह खड़ा है?

+0

एक 'छोटा वेक्टर' हमेशा छोटा नहीं होता है, इसलिए आपको 'स्टार्ट' से स्वतंत्र छोटे संग्रहण में पॉइंटर प्राप्त करने का एक तरीका चाहिए। यह आसानी से '& firstEl' के रूप में उपलब्ध है। –

+0

@ टी.सी. आपको इसकी आवश्यकता क्यों होगी? – Barry

+0

आप कैसे बताते हैं कि वेक्टर वर्तमान में इसके बिना छोटे मोड में है (या कुछ समकक्ष जानकारी)? –

उत्तर

6

स्टोरेज को विभाजित करना "आकार-मिटाए गए" प्रकार SmallVectorImpl में इनलाइन क्षमता (या "छोटा" बिट) संग्रहीत करने से बचाता है।

SmallVectorImpl<T> किसी भी SmallVector<T, N> को संदर्भित करने के लिए उपयोग किया जा सकता है और उस पर सभी वेक्टर संचालन का समर्थन करता है। जब अंतर्निहित स्टोरेज बढ़ता है तो सूचक इनलाइन क्षमता का उपयोग कर free पर पारित नहीं किया जा सकता है। मौजूदा स्टोरेज के पते की तुलना इनलाइन क्षमता के पहले तत्व से सुविधाजनक है और छोटे वेक्टर में थोड़ी मेमोरी बचाती है।

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