यह उत्तर शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन (SSO) का अच्छा उच्च-स्तरीय अवलोकन देता है। हालांकि, मैं अधिक विस्तार से जानना चाहूंगा कि यह व्यवहार में कैसे काम करता है, विशेष रूप से libc ++ कार्यान्वयन में:
SSO के लिए अर्हता प्राप्त करने के लिए स्ट्रिंग को कितना छोटा होना चाहिए? क्या यह लक्ष्य वास्तुकला पर निर्भर करता है?
स्ट्रिंग डेटा तक पहुँचने के दौरान कार्यान्वयन छोटे और लंबे तारों के बीच कैसे भेद करता है? क्या यह उतना ही सरल है
m_size <= 16
या यह एक झंडा है जो किसी अन्य सदस्य चर का हिस्सा है? (मुझे लगता है किm_size
या इसका एक हिस्सा भी स्ट्रिंग डेटा स्टोर करने के लिए इस्तेमाल किया जा सकता है)।
मैंने यह सवाल विशेष रूप से libc ++ के लिए पूछा क्योंकि मुझे पता है कि यह SSO का उपयोग करता है, यह भी libc ++ होम पेज पर उल्लिखित है ।
स्रोत को देखने के बाद यहाँ कुछ अवलोकन दिए गए हैं :
libc ++ को स्ट्रिंग क्लास के लिए दो अलग-अलग मेमोरी लेआउट के साथ संकलित किया जा सकता है, यह _LIBCPP_ALTERNATE_STRING_LAYOUT
ध्वज द्वारा शासित होता है । दोनों लेआउट भी छोटे-एंडियन और बड़े-एंडियन मशीनों के बीच अंतर करते हैं जो हमें कुल 4 अलग-अलग वेरिएंट के साथ छोड़ देते हैं। मैं "सामान्य" लेआउट और छोटे एंडियन को मान लूंगा जो इस प्रकार है।
यह मानकर कि size_type
4 बाइट्स और वह value_type
1 बाइट है, यह वह है जो एक स्ट्रिंग के पहले 4 बाइट्स मेमोरी में दिखेगी:
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
चूंकि शॉर्ट स्ट्रिंग का आकार ऊपरी 7 बिट्स में है, इसे एक्सेस करते समय इसे स्थानांतरित करने की आवश्यकता होती है:
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
इसी तरह, लंबे स्ट्रिंग की क्षमता के लिए गेटटर और सेटर बिट के __long_mask
आसपास काम करने के लिए उपयोग करता है is_long
।
मैं अभी भी अपने पहले प्रश्न के उत्तर की तलाश कर रहा हूं, अर्थात __min_cap
छोटे तारों की क्षमता, विभिन्न आर्किटेक्चर के लिए क्या मूल्य होगा ?
अन्य मानक पुस्तकालय कार्यान्वयन
यह उत्तरstd::string
अन्य मानक पुस्तकालय कार्यान्वयन में स्मृति लेआउट का एक अच्छा अवलोकन देता है ।
string
हेडर यहां पा सकते हैं , मैं इसे फिलहाल देख रहा हूं :)