यहां पोस्ट किए गए कारणों के अलावा एक और एक भी है - द्विआधारी संगतता । पुस्तकालयों के लेखकों का इस बात पर कोई नियंत्रण नहीं है std::string
कि आप किस कार्यान्वयन का उपयोग कर रहे हैं और क्या उनका मेमोरी लेआउट भी उनके जैसा है।
std::string
एक टेम्पलेट है, इसलिए इसका कार्यान्वयन आपके स्थानीय एसटीएल हेडर से लिया गया है। अब कल्पना करें कि आप मानक के साथ पूरी तरह से संगत कुछ प्रदर्शन-अनुकूलित एसटीएल संस्करण का उपयोग कर रहे हैं। उदाहरण के लिए, आपने std::string
डायनेमिक आवंटन और कैश मिस की संख्या को कम करने के लिए प्रत्येक में स्थिर बफर को घुसपैठ करने के लिए चुना हो सकता है । नतीजतन, मेमोरी लेआउट और / या आपके कार्यान्वयन का आकार पुस्तकालय की तुलना में अलग है।
यदि केवल लेआउट अलग है, तो कुछ std::string
सदस्य फ़ंक्शन लाइब्रेरी से क्लाइंट को दिए गए इंस्टेंस पर कॉल करते हैं या आसपास का अन्य तरीका विफल हो सकता है, यह निर्भर करता है कि किन सदस्यों को स्थानांतरित किया गया था।
यदि आकार अलग- std::string
अलग है, तो पुस्तकालय में और ग्राहक कोड में जांचे जाने पर सभी पुस्तकालय प्रकार के सदस्य अलग-अलग आकार के दिखाई देंगे। निम्न std::string
सदस्य के डेटा सदस्यों के पास ऑफ़सेट के रूप में अच्छी तरह से स्थानांतरित कर दिया जाएगा, और क्लाइंट से कॉल किए जाने वाले किसी भी सीधे एक्सेस / इनलाइन एक्सेसर को पुस्तकालय में डिबगिंग करते समय "ठीक लग रही है" के बावजूद बकवास वापस आ जाएगी।
बॉटमलाइन - यदि लाइब्रेरी और क्लाइंट कोड को फिर से अलग-अलग std::string
संस्करण संकलित किए जाते हैं , तो वे ठीक-ठीक लिंक करेंगे, लेकिन इसके परिणामस्वरूप कुछ खराब हो सकते हैं, कीड़े को समझना मुश्किल हो सकता है। यदि आप अपना std::string
कार्यान्वयन बदलते हैं, तो एसटीएल से सदस्यों को उजागर करने वाले सभी पुस्तकालयों को ग्राहक के std::string
लेआउट से मेल खाने के लिए फिर से तैयार करना होगा । और क्योंकि प्रोग्रामर चाहते हैं कि उनकी लाइब्रेरी मजबूत हो, तो आप शायद ही std::string
कहीं भी उजागर होंगे ।
निष्पक्ष होने के लिए, यह सभी एसटीएल प्रकारों पर लागू होता है। IIRC में उनके पास मेमोरी लेआउट नहीं है।