Окрім наведених тут причин, існує ще одна - бінарна сумісність . Письменники бібліотек не контролюють, яку std::string
реалізацію ви використовуєте та чи має вона такий же макет пам'яті, що і їх.
std::string
є шаблоном, тому його реалізація взята з локальних заголовків STL. Тепер уявіть, що ви локально використовуєте оптимізовану для продуктивності версію STL, повністю сумісну зі стандартом. Наприклад, ви, можливо, вибрали втручання статичного буфера в кожен, std::string
щоб зменшити кількість динамічних виділень і пропусків кешу. Як результат, схема пам'яті та / або розмір вашої реалізації відрізняється від бібліотеки.
Якщо лише макет відрізняється, деякі std::string
виклики функцій учасників для екземплярів, переданих з бібліотеки до клієнта, або навпаки можуть не працювати, залежно від того, які члени були зміщені.
Якщо розмір також різний, всі типи бібліотек, які мають std::string
член, виявляться різними розмірами при позначці в бібліотеці та в коді клієнта. У членів даних, які перебувають у наступному std::string
учаснику, також буде змінено зсув, і будь-який прямий доступ / вбудований доступ, викликаний від клієнта, поверне сміття, незважаючи на те, що "виглядає нормально" під час налагодження самої бібліотеки.
Підсумок - якщо бібліотека та код клієнта зібрані у різних std::string
версіях, вони будуть посилатися чудово, але це може призвести до деяких неприємних, важких для розуміння помилок. Якщо ви зміните свою std::string
реалізацію, всі бібліотеки, що відкривають членів STL, повинні бути перекомпільовані, щоб відповідати std::string
макеті клієнта . А оскільки програмісти хочуть, щоб їх бібліотеки були надійними, їх рідко можна побачити std::string
будь-де.
Справедливості це стосується всіх типів STL. IIRC вони не мають стандартизованого розміщення пам'яті.