c++ - Null terminated string, is it really dictated by the standard? -
इस सवाल का पहले से ही एक उत्तर है: < / P>
- 4 जवाब
चर्चा
< Ul> यह ज्ञात है कि सी ++ 11 से परे और std :: basic_string
s को रिक्त वर्णों को आंतरिक भंडारण बफ़र्स समाप्त कर दिया जाता है।
इस परिवर्तन का मुख्य कारण, दूसरों के बीच, यह था कि std :: basic_string
की पिछली परिभाषा को केवल बहुत सीमित समवर्ती प्रवेश की अनुमति दी गई थी और इस प्रकार, बहु-थ्रेडेड अनुप्रयोगों के लिए सीमित प्रदर्शन ( std :: basic_string
में परिवर्तनों के कारणों में और अधिक पढ़ा जा सकता है)।
हालांकि, मानक पढ़ना मैं नहीं कर सकता एक उद्धरण प्राप्त करें जहां स्पष्ट रूप से कहा गया है कि std :: basic_string
के पास एक रिक्त वर्ण का अंतराल आंतरिक भंडारण बफर होना चाहिए।
केवल अंतर्निहित उद्धरण, Ve पाया गया है §21.4.7.1 / 1 & amp; 3 बुनियादी_स्ट्रार्ड एक्सेसर्स [string.accessors]:
const charT * c_str () कॉन्स्ट नहीं किया जा सकता;
const charT * डेटा () const nonexcept;
1
रिटर्न: एक सूचकp
ऐसाp + i == और ऑपरेटर [] (i) प्रत्येक के लिए
i
में[0, आकार ()]
।
3
आवश्यक है: कार्यक्रम में कोई परिवर्तन नहीं होगा चरित्र सरणी में संग्रहीत मानों में से कोई भी।
-
मुझे लगता है कि दक्षता कारणों के कारण और § 21.4.7.1/3
के लिए आवश्यक है कि कार्यक्रम लौटे हुए बफर को, std :: basic_string :: c_str ()
और std :: basic_string :: डेटा में अधिकांश कार्यान्वयनकर्ताओं को नहीं बदलेगा
हालांकि, मानक कहीं भी राज्य नहीं करता है कि बफर जिसे std द्वारा लौटा दिया जाना चाहिए :: basic_string :: c_str ()
और std :: basic_string :: डेटा ()
std :: basic_string
के आंतरिक भंडारण बफर होना चाहिए और नहीं कुछ नल चरित्र समाप्त की गई प्रतिलिपि।
प्रश्न:
- क्या मानक में कहीं कहीं स्पष्ट रूप से कहा गया है कि
std :: basic_string < / कोड> आंतरिक भंडारण बफर निरर्थक वर्ण होना चाहिए?
अगर कोई स्पष्ट बयान नहीं है (यानी, प्रश्न # 1 संक्षिप्त उत्तर नहीं है), इसका क्या मतलब है कि कोई क्रियान्वयनकर्ता Std :: basic_string
एक नल चरित्र के साथ समाप्त आंतरिक भंडारण बफर और इसके परिणामस्वरूप व्यापक फैलाव का अनुमान है कि चूंकि सी ++ 11 स्ट्रिंग्स निरस्त हैं, वह गलत है?
से 21.4.5 :
< Blockquote> const_reference ऑपरेटर [] (size_type pos)
संदर्भ ऑपरेटर [] (size_type pos);
1 की आवश्यकता है: स्थिति ।
2 रिटर्न: * (begin () + pos)
अगर pos & lt; आकार ()
, अन्यथा कोई वस्तु वस्तु का संदर्भ T
मान charT ()
; संदर्भित मान को संशोधित नहीं किया जाएगा।
ध्यान दें कि s [s.size ()]
अच्छी तरह से परिभाषित है और NUL वर्ण वापस करने के लिए आवश्यक है।
हालांकि, इसके द्वारा स्वयं की आवश्यकता नहीं होती है NUL
-टर्मिनेटेड आंतरिक संग्रहण 21.4.1 / 5 ऐसा कहने के लिए है:
एक मूल_स्ट्राइंग ऑब्जेक्ट में चार-जैसे ऑब्जेक्ट संचित्र रूप से संग्रहीत किया जाएगा यह, किसी भी मूल_स्ट्रिंग
ऑब्जेक्ट s
के लिए, पहचान & amp; * (s.begin () + n) == और * s.begin () + N
को n
के सभी मानों के लिए रखा जाएगा, ऐसा 0 & lt; = n & lt; S.size ()
।
ध्यान दें कि निकटवर्ती भंडारण को केवल n & lt; S.size ()
, लेकिन s.size ()
स्वयं के लिए नहीं। इसलिए char * p = & amp; [0];
जरूरी नहीं कि NUL
-tminated बफर को इंगित नहीं करता है, क्योंकि मानक के लिए यह आवश्यक नहीं है कि p डेटा ()
, c_str ()
पर और आवश्यकताओं के बीच व्यावहारिक रूप से बोलते हुए कोड> ऑपरेटर []
, कोई भी समझदार कार्यान्वयन एक NUL
-टाटा हुआ भंडारण बनाएगा। लेकिन पागल कार्यान्वयन मानक द्वारा नहीं छोड़ा जा रहा है।
Comments
Post a Comment