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 के आंतरिक भंडारण बफर होना चाहिए और नहीं कुछ नल चरित्र समाप्त की गई प्रतिलिपि।

    प्रश्न:

    1. क्या मानक में कहीं कहीं स्पष्ट रूप से कहा गया है कि std :: basic_string < / कोड> आंतरिक भंडारण बफर निरर्थक वर्ण होना चाहिए?
    2. अगर कोई स्पष्ट बयान नहीं है (यानी, प्रश्न # 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

    Popular posts from this blog

    sqlite3 - UPDATE a table from the SELECT of another one -

    c# - Showing a SelectedItem's Property -

    javascript - Render HTML after each iteration in loop -