นอกเหนือจากเหตุผลที่โพสต์ที่นี่ยังมีอีกคนหนึ่ง - compability ไบนารี ตัวเขียนของ Library ไม่สามารถควบคุมstd::string
การใช้งานที่คุณกำลังใช้อยู่และมีรูปแบบหน่วยความจำแบบเดียวกันกับที่ใช้หรือไม่
std::string
เป็นเทมเพลตดังนั้นการนำไปปฏิบัติจะถูกนำมาจากส่วนหัว STL ในพื้นที่ของคุณ ตอนนี้จินตนาการว่าคุณกำลังใช้รุ่น STL ที่ปรับให้เหมาะสมกับประสิทธิภาพภายในเครื่องซึ่งเข้ากันได้กับมาตรฐานอย่างสมบูรณ์ ตัวอย่างเช่นคุณอาจเลือกที่จะบุกรุกบัฟเฟอร์คงที่ในแต่ละครั้งstd::string
เพื่อลดจำนวนการจัดสรรแบบไดนามิกและแคชที่หายไป ดังนั้นรูปแบบหน่วยความจำและ / หรือขนาดของการใช้งานของคุณจึงแตกต่างจากของไลบรารี
ถ้าเลย์เอาต์นั้นแตกต่างกันไปบางstd::string
ฟังก์ชั่นสมาชิกจะเรียกใช้อินสแตนซ์ที่ส่งจากไลบรารีไปยังไคลเอนต์หรือวิธีอื่นอาจล้มเหลวโดยขึ้นอยู่กับสมาชิกที่ถูกเลื่อน
หากขนาดแตกต่างกันเช่นกันประเภทห้องสมุดทั้งหมดที่มีstd::string
สมาชิกจะปรากฏเป็นขนาดแตกต่างกันเมื่อทำการตรวจสอบในไลบรารีและในรหัสลูกค้า สมาชิกข้อมูลที่ติดตามstd::string
สมาชิกจะมีออฟเซ็ตที่เลื่อนออกไปเช่นกันและการเข้าถึงโดยตรง / อินไลน์ accessor ที่เรียกจากไคลเอนต์จะส่งคืนขยะแม้ว่า "มองตกลง" เมื่อทำการดีบักไลบรารีเอง
Bottomline - ถ้าไลบรารี่และรหัสลูกค้านั้นคอมไพล์ agains std::string
เวอร์ชันต่างๆ พวกมันจะลิงค์ได้ดี แต่มันอาจส่งผลให้เกิดข้อผิดพลาดที่น่ารังเกียจและเข้าใจยาก หากคุณเปลี่ยนstd::string
การใช้งานไลบรารีทั้งหมดที่เปิดเผยสมาชิกจาก STL จะต้องทำการคอมไพล์ใหม่เพื่อให้ตรงกับstd::string
เลย์เอาต์ของลูกค้า และเนื่องจากโปรแกรมเมอร์ต้องการห้องสมุดของพวกเขาจะแข็งแกร่งคุณจะไม่ค่อยเห็นstd::string
สัมผัสได้ทุกที่
เพื่อความเป็นธรรมสิ่งนี้ใช้กับ STL ทุกประเภท IIRC ไม่มีเลย์เอาต์ของหน่วยความจำที่มีมาตรฐาน