Terlepas dari alasan yang diposting di sini ada juga satu lagi - kompatibilitas biner . Penulis perpustakaan tidak memiliki kendali atas std::string
implementasi yang Anda gunakan dan apakah memiliki tata letak memori yang sama dengan mereka.
std::string
adalah 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::string
fungsi 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::string
anggota akan tampak memiliki ukuran yang berbeda ketika diperiksa di perpustakaan dan dalam kode klien. Anggota data yang mengikuti std::string
anggota 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::string
versi yang berbeda , mereka akan terhubung dengan baik, tetapi mungkin menghasilkan beberapa bug yang sulit dimengerti. Jika Anda mengubah std::string
implementasi Anda, semua perpustakaan yang mengekspos anggota dari STL harus dikompilasi ulang agar sesuai dengan std::string
tata letak klien . Dan karena pemrogram ingin perpustakaan mereka menjadi kuat, Anda jarang melihat di std::string
mana saja.
Agar adil, ini berlaku untuk semua jenis STL. IIRC mereka tidak memiliki tata letak memori yang standar.