Burada yayınlanan sebeplerin yanı sıra, başka bir tane de ikili uygunluk bulunmaktadır . Kütüphanelerin yazarları, hangi std::string
uygulamayı kullandığınız ve onunkilerle aynı bellek düzenine sahip olup olmadığının kontrolü yoktur .
std::string
bir şablon olduğundan, uygulaması yerel STL başlıklarınızdan alınır. Şimdi, standart olarak tam uyumlu, performans açısından optimize edilmiş bazı STL versiyonlarını kullandığınızı hayal edin. Örneğin, std::string
dinamik ayırma sayısını ve önbellek eksikliğini azaltmak için her birine statik tampon girmeyi tercih etmiş olabilirsiniz . Sonuç olarak, uygulamanızın bellek düzeni ve / veya boyutu kütüphaneinkinden farklı.
Yalnızca düzen farklıysa, bazı std::string
üye işlevi kitaplıktan istemciye iletilen örnekler üzerinde çağrı yapar veya diğer üyeler hangi üyelerin kaydırıldığına bağlı olarak başarısız olabilir.
Eğer boyut da farklıysa, std::string
üyeli tüm kütüphane tipleri kütüphanede ve müşteri kodunda kontrol edildiğinde farklı boyutta görünecektir. std::string
Üyeyi takip eden veri üyeleri de ofsetlerde kaymış olacak ve müşteriden çağrılan herhangi bir doğrudan erişim / satır içi erişimci, kitaplığın kendisinde hata ayıklama yaparken "iyi görünmesine" rağmen çöpü geri getirecektir.
Sonuç olarak - eğer kütüphane ve müşteri kodu farklı std::string
versiyonlar için tekrar derlenirse , sadece gayet iyi bağlanırlar , ancak anlaşılması zor bazı hatalara yol açabilir. std::string
Uygulamanızı değiştirirseniz, STL'den üye olan tüm kütüphanelerin, müşterinin std::string
düzeniyle eşleşmesi için derlenmesi gerekir . Programcılar kütüphanelerinin sağlam olmasını istediklerinden, nadiren std::string
her yerde görülebildiğini göreceksiniz .
Adil olmak gerekirse, bu tüm STL tipleri için geçerlidir. IIRC'de standart bellek düzeni yoktur.