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