std :: vector में कोई .data() क्यों नहीं है?
क्योंकि std::vector<bool>
1 बाइट में एकाधिक मान संग्रहीत करता है।
इसके बारे में एक संपीड़ित भंडारण प्रणाली की तरह सोचें, जहां प्रत्येक बूलियन मान को 1 बिट की आवश्यकता होती है। तो, बजाय स्मृति ब्लॉक प्रति एक तत्व (सरणी सेल प्रति एक तत्व) होने का, स्मृति लेआउट कुछ ऐसा दिखाई देगा:
मान लिया जाये कि सूचकांक करने के लिए कि आप चाहते हैं एक ब्लॉक एक मूल्य प्राप्त करने के लिए, कैसे होगा आप ऑपरेटर []
का उपयोग करते हैं? यह bool&
वापस नहीं लौटा सकता है (क्योंकि यह एक बाइट लौटाएगा, जो एक से अधिक bools
स्टोर करता है), इस प्रकार आप bool*
को असाइन नहीं कर सके। दूसरे शब्दों में bool *bool_ptr =&v[0];
मान्य कोड नहीं है, और परिणामस्वरूप एक संकलन त्रुटि होगी।
इसके अलावा, एक सही कार्यान्वयन में उस विशेषज्ञता नहीं हो सकती है और स्मृति अनुकूलन (संपीड़न) नहीं करता है। इसलिए data()
को कार्यान्वयन के आधार पर अपेक्षित रिटर्न प्रकार पर प्रतिलिपि बनाना होगा (या मानक को केवल इसे अनुमति देने के बजाय अनुकूलन को बल देना चाहिए)।
बूल की एक सरणी के लिए सूचक क्यों नहीं लौटाया जा सकता है?
क्योंकि std::vector<bool>
नहीं bools की एक सरणी के रूप में जमा है, इस प्रकार कोई सूचक एक सरल तरीके से वापस किया जा सकता। यह कर सकता है कि एक सरणी के लिए डेटा को कॉपी करके और उस सरणी लौटने के लिए, लेकिन यह एक डिजाइन पसंद करने के लिए नहीं है (अगर वे किया था, मुझे लगता है कि यह सब कंटेनरों के लिए data()
, जो भ्रामक होगा रूप में काम करता लगता होगा)।
ऐसा करने में क्या फायदे हैं?
मेमोरी अनुकूलन।
आमतौर पर 8 गुना कम स्मृति के उपयोग, क्योंकि यह एक एकल बाइट में एक से अधिक टुकड़े संग्रहीत करता है। सटीक होने के लिए, CHAR_BIT
गुना कम।
'वेक्टर' एक बाइट में कई bool पैकिंग द्वारा अंतरिक्ष अनुकूलन के लिए अनुमति देते हैं। 'डेटा()' उस लाभ को हटा देगा। –
Jarod42
लाभ यह है कि आप 8 गुना कम स्मृति का उपयोग करते हैं। नकारात्मकता यह है कि आप लोगों की अपेक्षाओं के साथ गड़बड़ करते हैं। यह कम या ज्यादा निष्कर्ष निकाला गया है कि नकारात्मक लाभ लाभ से अधिक है। – nwp
'std :: वेक्टर' कानून में अपनी माँ को आमंत्रित करने के साथ रहना पसंद थोड़ा है।यह उस समय एक अच्छा विचार प्रतीत हो सकता है, लेकिन आप अंततः पूरे विचार पर खेद करेंगे। सौभाग्य से मैं केवल इन अपराधों में से एक के साथ खुद को श्रेय दे सकता हूं। –
Bathsheba