std :: dynarray बनाम std :: वेक्टर


84

C ++ 14 प्रस्तुत करता है std::dynarray:

std :: dynarray एक सीक्वेंस कंटेनर है जो एरेज़ को एक साइज़ के साथ एनकैप्सुलेट करता है जो कंस्ट्रक्शन पर फिक्स होता है और ऑब्जेक्ट के पूरे जीवनकाल में नहीं बदलता है।

std::dynarrayरन-टाइम में ही आवंटित किया जाना चाहिए std::vector

तो क्या लाभ और उपयोग std::dynarrayकरते समय हम उपयोग कर सकते हैं std::vectorजो अधिक गतिशील है (और फिर से बड़े आकार का)?


1
अरे, कब से "C ++ 14" एक टैग है? मैं उस दिन की तलाश कर रहा था और यह मौजूद नहीं था ...
केरेक एसबी

1
के std::valarrayरूप में नाम दिया गया है std::dynarray? std::dynarrayजब इसे फिर से आकार नहीं दिया जा सकता है, तो इसके बारे में गतिशील ?
यासुसर

9
@yasouser, नहीं, इससे कोई लेना-देना नहीं है valarray। यह गतिशील है क्योंकि सरणी की लंबाई एक रन-टाइम मान है, इसे संकलन-समय पर ज्ञात करने की आवश्यकता नहीं है, इसके विपरीतstd::array
जोनाथन वैक्ली

21
ध्यान दें कि पिछले सप्ताह C ++ मानक समिति की बैठक में, dynarrayC ++ 14 से हटा दिया गया था और भविष्य में तकनीकी विनिर्देश (TR1 के नए संस्करण के रूप में उस पर विचार करें) में डाल दिया गया था क्योंकि इसमें कुछ गंभीर तकनीकी समस्याएं हैं।
पीट बेकर

2
dynarray अब C ++ 14 के मसौदे का हिस्सा नहीं है
cassinaj

जवाबों:


89

तो हम क्या लाभ और उपयोग std::dynarrayकर सकते हैं, जब हम उपयोग कर सकते हैं std::vectorजो अधिक गतिशील (पुन: प्रयोज्य) है?

dynarrayकी तुलना में छोटा और सरल है vector, क्योंकि इसके लिए अलग आकार और क्षमता मानों को प्रबंधित करने की आवश्यकता नहीं है, और इसके लिए एक एलोकेटर को स्टोर करने की आवश्यकता नहीं है।

हालांकि मुख्य प्रदर्शन लाभ इस तथ्य से आता है कि कार्यान्वयन को dynarrayस्टैक पर आवंटित करने के लिए प्रोत्साहित किया जाता है जब संभव हो, तो किसी भी ढेर आवंटन से बचना चाहिए। जैसे

std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

इस अनुकूलन को कंपाइलर से सहयोग की आवश्यकता होती है, इसे शुद्ध पुस्तकालय प्रकार के रूप में लागू नहीं किया जा सकता है, और आवश्यक कंपाइलर जादू को लागू नहीं किया गया है और किसी को यकीन नहीं है कि यह करना कितना आसान है। कार्यान्वयन के अनुभव की कमी के कारण, पिछले हफ्ते शिकागो में C ++ समिति की बैठक में std::dynarrayC ++ 14 से खींचने और एक अलग सरणी एक्सटेंशन टीएस (तकनीकी विनिर्देश) दस्तावेज़ को जारी करने std::experimental::dynarrayऔर रनटाइम बाउंड (ARBs ) के सरणियों को जारी करने का निर्णय लिया गया था , समान C99 VLAs को।) इसका मतलब std::dynarrayलगभग निश्चित रूप से C ++ 14 में नहीं होगा।


1
महान, मैं सोच रहा था कि क्या जंगली में कोई गैर-तुच्छ कार्यान्वयन था dynarray। मैं हमेशा सोचता था कि मानकीकरण के लिए पात्र बनने से पहले आपको मौजूदा अभ्यास के दो स्वतंत्र कार्यान्वयनों की आवश्यकता होगी।
केरेक एसबी

नहीं, स्टैक-आवंटन का कोई ज्ञात कार्यान्वयन नहीं है dynarray। हालांकि कार्यान्वयन का अनुभव बहुत उपयोगी है, इसके लिए कोई सेट नियम की आवश्यकता नहीं है (लेकिन कुछ का कहना है कि वहाँ होना चाहिए!)
जोनाथन वेकली

यहां केवल विचार-मंथन किया गया है लेकिन 2 कार्य बनाने के बारे में क्या है: std :: dynarray make_dyn_autostorage (int) और std :: dynarray make_dyn_heap (int)?
लॉरिजसेन

2
@KerrekSB, हाँ, शिकागो में लाइब्रेरी मोशन 10 था: "हटो हम एक नियोजित एरे एक्सटेंशन के लिए एक वर्किंग पेपर बनाते हैं, दो पेपर N3639 द्वारा C ++ 14 CD पर लागू किए गए एडिट को हटाते हैं ," ऑटोमैटिक के साथ रनटाइम आकार के एरेज़ भंडारण अवधि (संशोधन 5) " N3662 ," C ++ डायनामिक एरे (dynarray) "और एरे एक्सटेंशन्स TS प्रोजेक्ट एडिटर को निर्देश दें कि वह एरियर एक्सटेंशन वर्किंग पेपर को अपनी प्रारंभिक सामग्री के रूप में उन शब्दों को लागू करें।"
जोनाथन वेकली

3
@ h9uest जिसका "सी ++ लोग" से कोई लेना-देना नहीं है, वे एक आईएसओ तकनीकी समिति के डिलिवरेबल्स के आधिकारिक नाम हैं, iso.org/iso/home/standards_development/… और iso.org/iso/home/standards_development देखें /…
जोनाथन वेकली

31

जैसा कि आपने खुद कहा std::dynarrayहै, एक निश्चित आकार के गतिशील सरणी के लिए है। यह resizable नहीं है। यह मोटे तौर पर एक सुधार से अधिक बोल रहा new T[N]है और अधिक std::unique_ptr<T[]>(new T[N])

क्षमता का आकार बदलने या प्रबंधन करने की आवश्यकता नहीं है, इसका मतलब है कि आप कम जटिलता और कम स्थान पर डेटा संरचना को लागू कर सकते हैं।

इसके अलावा, std::dynarrayएक अजीब जानवर है जो इसे अलग-अलग, गैर-विशिष्ट तरीकों से लागू करने की अनुमति देता है, उदाहरण के लिए यह सरणी को स्टैक पर रखना संभव है। आवंटन फ़ंक्शन को कॉल करना "वैकल्पिक" है। आप सरणी के तत्वों के निर्माण के लिए एक आबंटक निर्दिष्ट कर सकते हैं, लेकिन यह प्रकार का हिस्सा नहीं है।

आपको यह भी आश्चर्य हो सकता है कि हमें क्यों std::dynarray और चर-लंबाई सरणियों की आवश्यकता है। C ++ 14 में वीएलएएएस बहुत अधिक प्रतिबंधक हैं; वे केवल स्थानीय, स्वचालित चर हो सकते हैं और आवंटन नीति निर्दिष्ट करने का कोई तरीका नहीं पेश करते हैं, और निश्चित रूप से उनके पास मानक कंटेनर इंटरफ़ेस नहीं है।


"वर्तमान मसौदे" के 23.3.4.2 से कुछ उदाहरण (लीजिए, Google कैश):

explicit dynarray(size_type c);

प्रभाव:c तत्वों के लिए भंडारण आवंटित करता है। मई या वैश्विक आह्वान नहीं हो सकता है operator new

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

प्रभाव: पूर्ववर्ती कंस्ट्रक्टर के समतुल्य सिवाय इसके कि प्रत्येक तत्व का उपयोग उपयोग-आबंटन निर्माण के साथ किया जाता है

सरणी तत्वों के निर्माण के लिए आप दिए गए आवंटनकर्ता का उपयोग कर सकते हैं या नहीं, यह एक वैश्विक विशेषता है:

टेम्पलेट संरचना का उपयोग करता है_आलोकेटर, Alloc>: true_type {};

आवश्यकता है: Alloc एक एलोकेटर (17.6.3.5) होगा। [ नोट: इस विशेषता के विशेषज्ञता से अन्य पुस्तकालय घटकों को सूचित dynarrayकिया जाता है जिनका निर्माण एक आवंटनकर्ता के साथ किया जा सकता है, भले ही इसके पास नेस्टेड एलाटेटर_टाइप न हो।]

संपादित करें: जोनाथन वैक्ली का उत्तर कहीं अधिक आधिकारिक और व्यावहारिक होने के लिए बाध्य है।


आवंटन के लिए एक आबंटक को पास करना dynarrayकभी भी आबंटन के लिए उपयोग नहीं किया जाता है, इसका उपयोग केवल तत्वों के कंस्ट्रक्टरों के तर्क के रूप में किया जाता है ("उपयोग-आबंटक निर्माण" का उपयोग करके)। इसीलिए अगर आप एलोकेटर का उपयोग किया गया था तो आप क्वेरी नहीं कर सकते: क्योंकि यह कभी नहीं है।
जोनाथन वेकली

@JonathanWakely: आह, मैंने गलत समझा। धन्यवाद, निश्चित!
केरेक एसबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.