2017-09-08 62 views
11

std::vector<bool> का विशेषज्ञता, जैसा कि सी ++ 11 23.3.7/1 में निर्दिष्ट है, डेटा सदस्य घोषित नहीं करता है (उदाहरण के लिए here और here का उल्लेख किया गया है)।std :: vector <bool> में कोई .data() क्यों नहीं है?

सवाल यह है: std :: vector में कोई .data() क्यों नहीं है? यह वही सवाल है क्योंकि बूल का वेक्टर स्मृति में संगत रूप से क्यों संग्रहीत नहीं होता है। ऐसा करने में क्या फायदे हैं?

बूल की एक सरणी के लिए सूचक क्यों नहीं लौटाया जा सकता है?

+2

'वेक्टर ' एक बाइट में कई bool पैकिंग द्वारा अंतरिक्ष अनुकूलन के लिए अनुमति देते हैं। 'डेटा()' उस लाभ को हटा देगा। – Jarod42

+3

लाभ यह है कि आप 8 गुना कम स्मृति का उपयोग करते हैं। नकारात्मकता यह है कि आप लोगों की अपेक्षाओं के साथ गड़बड़ करते हैं। यह कम या ज्यादा निष्कर्ष निकाला गया है कि नकारात्मक लाभ लाभ से अधिक है। – nwp

+3

'std :: वेक्टर ' कानून में अपनी माँ को आमंत्रित करने के साथ रहना पसंद थोड़ा है।यह उस समय एक अच्छा विचार प्रतीत हो सकता है, लेकिन आप अंततः पूरे विचार पर खेद करेंगे। सौभाग्य से मैं केवल इन अपराधों में से एक के साथ खुद को श्रेय दे सकता हूं। – Bathsheba

उत्तर

23

std :: vector में कोई .data() क्यों नहीं है?

क्योंकि std::vector<bool> 1 बाइट में एकाधिक मान संग्रहीत करता है।

इसके बारे में एक संपीड़ित भंडारण प्रणाली की तरह सोचें, जहां प्रत्येक बूलियन मान को 1 बिट की आवश्यकता होती है। तो, बजाय स्मृति ब्लॉक प्रति एक तत्व (सरणी सेल प्रति एक तत्व) होने का, स्मृति लेआउट कुछ ऐसा दिखाई देगा:

enter image description here

मान लिया जाये कि सूचकांक करने के लिए कि आप चाहते हैं एक ब्लॉक एक मूल्य प्राप्त करने के लिए, कैसे होगा आप ऑपरेटर [] का उपयोग करते हैं? यह bool& वापस नहीं लौटा सकता है (क्योंकि यह एक बाइट लौटाएगा, जो एक से अधिक bools स्टोर करता है), इस प्रकार आप bool* को असाइन नहीं कर सके। दूसरे शब्दों में bool *bool_ptr =&v[0]; मान्य कोड नहीं है, और परिणामस्वरूप एक संकलन त्रुटि होगी।

इसके अलावा, एक सही कार्यान्वयन में उस विशेषज्ञता नहीं हो सकती है और स्मृति अनुकूलन (संपीड़न) नहीं करता है। इसलिए data() को कार्यान्वयन के आधार पर अपेक्षित रिटर्न प्रकार पर प्रतिलिपि बनाना होगा (या मानक को केवल इसे अनुमति देने के बजाय अनुकूलन को बल देना चाहिए)।

बूल की एक सरणी के लिए सूचक क्यों नहीं लौटाया जा सकता है?

क्योंकि std::vector<bool>नहीं bools की एक सरणी के रूप में जमा है, इस प्रकार कोई सूचक एक सरल तरीके से वापस किया जा सकता। यह कर सकता है कि एक सरणी के लिए डेटा को कॉपी करके और उस सरणी लौटने के लिए, लेकिन यह एक डिजाइन पसंद करने के लिए नहीं है (अगर वे किया था, मुझे लगता है कि यह सब कंटेनरों के लिए data(), जो भ्रामक होगा रूप में काम करता लगता होगा)।

ऐसा करने में क्या फायदे हैं?

मेमोरी अनुकूलन।

आमतौर पर 8 गुना कम स्मृति के उपयोग, क्योंकि यह एक एकल बाइट में एक से अधिक टुकड़े संग्रहीत करता है। सटीक होने के लिए, CHAR_BIT गुना कम।

+1

बीटीडब्ल्यू, सही कार्यान्वयन में उस विशेषज्ञता नहीं हो सकती है और स्मृति अनुकूलन नहीं करता है। इसलिए 'डेटा() को कार्यान्वयन के आधार पर अपेक्षित रिटर्न प्रकार पर प्रतिलिपि बनाना होगा। (या मानक को केवल इसे अनुमति देने के बजाय अनुकूलन को मजबूर करना चाहिए)। – Jarod42

+2

"8 गुना कम" अनिवार्य रूप से * सत्य नहीं है और इस जवाब को खराब करता है कि अन्यथा कैननिसिटी का झगड़ा होता है। 'CHAR_BIT' या इसी तरह के संशोधन में संशोधन करें? – Bathsheba

+1

@gsamaras: अगर मैं कर सकता तो मैं फिर से ऊपर उठ जाऊंगा। – Bathsheba

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