2010-04-18 10 views
15

23.3.6.2 वेक्टर क्षमता में C++ 0x FCD कहता है:क्यों shrink_to_fit गैर बाध्यकारी है?

void shrink_to_fit(); 

टिप्पणी: shrink_to_fit एक गैर बाध्यकारी क्षमता को कम करने के अनुरोध है() आकार के लिए()। [नोट: अनुरोध कार्यान्वयन-विशिष्ट अनुकूलन के लिए अक्षांश की अनुमति देने के लिए गैर बाध्यकारी है। — अंत नोट]

क्या अनुकूलन की अनुमति है?

+13

मैं कल्पना कर सकता हूं कि कुछ आवंटक निश्चित लंबाई के ब्लॉक में आवंटित करना चाहते हैं। इस प्रकार यदि तत्व का आकार उस ब्लॉक आकार से छोटा है, तो यह अभी भी समग्र हो सकता है। बस कुछ अनुमान ... –

+1

@ जोहान्स: यदि आपने इसे उत्तर के रूप में पोस्ट किया है, तो इसे स्पष्ट करना बहुत आसान होगा। नीचे टिप्पणी करने के लिए मेरी टिप्पणी देखें, साथ ही मैं नहीं देखता कि कैसे आवंटक वेक्टर को संवाद कर सकता है (आवंटित() केवल एक सूचक लौटाता है), लेकिन मुझे लगता है कि अगर यह std :: आवंटक का उपयोग किया जाता है तो यह आंशिक रूप से विशिष्ट हो सकता है। हालांकि यह मुझे उपयोगकर्ता विशेषज्ञता के बारे में आश्चर्यचकित करता है (अभी भी अनुमति है, है ना?) और संघर्ष। –

उत्तर

11

यह वह जगह है काफी बाहर तनावपूर्ण, लेकिन:

वेक्टर के संभाजक है कि केवल के साथ, कहते हैं स्मृति को आबंटित कर सकता है, 4 KB का पठन स्तर पर विचार करें। तो अगर वेक्टर की 4096 की क्षमता थी और 40 9 5 के आकार के रूप में स्मृति को पुन: आवंटित करने का अर्थ नहीं होगा क्योंकि यह स्मृति को संरक्षित नहीं करेगा, फिर भी तत्वों की प्रतिलिपि बनाने के लिए कुछ CPU समय बर्बाद कर देगा।

+0

व्यवहार्य है, लेकिन इस बात को संवाद करने के लिए मानक आवंटक इंटरफ़ेस में कोई रास्ता नहीं है। (जब तक कि मैं 0x अतिरिक्त नहीं चूक जाता?) आकार 4095 है और फिर क्षमता 4096 को स्वतंत्र रूप से किया जा सकता है, और मुझे लगता है कि समझ में आता है --- सिवाय इसके कि मैं इसे जांच सकता हूं अगर मैं shrink_to_fit को कॉल करने से पहले चाहता था। –

+0

ठीक है, पहले से ही एक विशेष मामला वेक्टर है। आवंटकों में स्पष्ट रूप से कम से कम 1 बाइट ग्रैन्युलरिटी होती है और, जहां तक ​​मुझे याद है, वेक्टर थोड़ा प्रति तत्व का उपयोग करता है। वास्तव में मामूली, हालांकि। – doublep

+0

वेक्टर एक घृणा आम तौर पर गलती होने के लिए सहमत होती है।इससे समस्याएं पैदा होती हैं यदि आप एक टेम्पलेट लिखते हैं जो बूल का उपयोग कर सकता है और वास्तविक कंटेनर इंटरफ़ेस की अपेक्षा कर सकता है, और मुझे उम्मीद है कि वेक्टर के लिए कोई अन्य विशेषज्ञता समान रूप से टूटा नहीं जा सकता है (वास्तव में, AFAIK, मानक इसे मना कर देगा)। –

4

राउंडिंग विचार वास्तव में प्रासंगिक हैं, बल्कि अप्रत्यक्ष रूप से। सवाल यह है कि "क्या अनुकूलन की अनुमति है।" यह मानकीकरण प्रक्रिया wrt के बारे में कुछ धारणा बना रहा है। अनुकूलन। आम तौर पर, इरादा सभी गैर-देखने योग्य अनुकूलनों को अनुमति देना है और फिर कुछ - जैसे प्रतिलिपि की प्रतिलिपि जहां प्रतिलिपि ctor की कॉल-कॉलिंग देखने योग्य नहीं है। इस मामले में, capacity() != size() अनुकूलन का एक अवलोकन प्रभाव हो सकता है, और मानक इसे अनुमति देता है।

इस अक्षांश को जोड़ने के कारणों के लिए, मैं capacity()size() का केवल 101% - बहुत कम लाभ होने पर एक संक्षिप्त अनुरोध को अनदेखा करने की कल्पना भी कर सकता हूं। कभी भी एक सटीक कारण नहीं होगा, क्योंकि एलडब्लूजी में कई दृष्टिकोण वाले कई लोग शामिल हैं। वहां एक आम सहमति थी कि इस स्वतंत्रता को प्रदान करके पर्याप्त अतिरिक्त अनुकूलन अवसर उपलब्ध हैं।

+0

मुझे पता है कि, सामान्य रूप से, मानक कई अलग-अलग और प्रतिस्पर्धी अनुकूलन से चुनने के लिए कार्यान्वयन की अनुमति देता है। हालांकि, स्पष्ट नोट को देखते हुए, मैंने सोचा कि कुछ ठोस हो सकते हैं, और उम्मीद है कि "आपने इस कार्रवाई का अनुरोध किया है और हम असहमत हैं, स्थिति: अस्वीकार कर दी गई है"। –

0

हालांकि यह पहले से ही विशेष है, वेक्टर < बूल> आकार 8 के ब्लॉक में आवंटित करना है। मुझे यह भी पता है कि कुछ लोग किसी भी आवंटित ब्लॉक के 'सही आकार' को वापस करने के लिए मॉलोक प्राप्त करने पर काम कर रहे हैं, इसलिए यदि आवंटित ब्लॉक अपरिवर्तनीय अपशिष्ट पेश किया होगा, बजाय वेक्टर उपयोगी रूप से अंतरिक्ष का उपयोग करता है।

जैसे ही हम 64-बिट ओएसई में जाते हैं, स्मृति स्थान अचानक (प्रसिद्ध अंतिम शब्द) बन जाता है, किसी के मुकाबले कहीं भी बड़ा हो जाता है, इसलिए वर्चुअल मेमोरी के बड़े ब्लॉक आवंटित करने और उन्हें भरने के लिए और अधिक उचित हो जाता है। चारों ओर वस्तुओं को स्थानांतरित करना महंगी है, और व्यावहारिक रूप से समय की बर्बादी है, क्योंकि हम चीजों को नहीं ले रहे हैं क्योंकि भौतिक स्मृति सीमित है, केवल एक आभासी स्थान से दूसरे तक!

+0

यह shrink_to_fit गैर-बाध्यकारी होने से सक्षम संभावित अनुकूलन से कैसे संबंधित है? –

+0

क्योंकि अगर वेक्टर को shrink_to_fit करने के लिए मजबूर किया गया था, यहां तक ​​कि जब उसे अतिरिक्त मेमोरी थी, तब भी इससे छुटकारा नहीं मिल सका, तो यह बाद में उस स्मृति को "फिर से खोजना" शुरू कर देगा। इसके लिए आगे बढ़ना बेहतर है और कहें "मैं अपने बफर को स्मृति से बर्बाद किए बिना, इस से छोटा छोटा नहीं कर सकता"। –

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