Terlepas dari alasan yang diposting di sini ada juga satu lagi - kompatibilitas biner . Penulis perpustakaan tidak memiliki kendali atas std::stringimplementasi yang Anda gunakan dan apakah memiliki tata letak memori yang sama dengan mereka.
std::stringadalah templat, jadi implementasinya diambil dari tajuk STL lokal Anda. Sekarang bayangkan Anda secara lokal menggunakan beberapa versi STL yang dioptimalkan kinerja, sepenuhnya kompatibel dengan standar. Misalnya, Anda mungkin telah memilih untuk mengganggu buffer statis di masing std::string- masing untuk mengurangi jumlah alokasi dinamis dan kesalahan cache. Akibatnya, tata letak memori dan / atau ukuran implementasi Anda berbeda dari yang perpustakaan.
Jika hanya tata letak yang berbeda, beberapa std::stringfungsi anggota memanggil instance yang dikirimkan dari pustaka ke klien atau sebaliknya mungkin gagal, bergantung pada anggota yang dipindahkan.
Jika ukurannya juga berbeda, semua tipe perpustakaan yang memiliki std::stringanggota akan tampak memiliki ukuran yang berbeda ketika diperiksa di perpustakaan dan dalam kode klien. Anggota data yang mengikuti std::stringanggota akan memiliki perubahan offset juga, dan akses langsung / aksesor inline yang dipanggil dari klien akan mengembalikan sampah, meskipun "tampak OK" ketika men-debug perpustakaan itu sendiri.
Bottomline - jika pustaka dan kode klien dikompilasi terhadap std::stringversi yang berbeda , mereka akan terhubung dengan baik, tetapi mungkin menghasilkan beberapa bug yang sulit dimengerti. Jika Anda mengubah std::stringimplementasi Anda, semua perpustakaan yang mengekspos anggota dari STL harus dikompilasi ulang agar sesuai dengan std::stringtata letak klien . Dan karena pemrogram ingin perpustakaan mereka menjadi kuat, Anda jarang melihat di std::stringmana saja.
Agar adil, ini berlaku untuk semua jenis STL. IIRC mereka tidak memiliki tata letak memori yang standar.