Oltre ai motivi pubblicati qui c'è anche un altro - compabilità binaria . I writer delle biblioteche non hanno alcun controllo su quale implementazione di std::string
stai usando e se abbia lo stesso layout di memoria del loro.
std::string
è un modello, quindi la sua implementazione è presa dalle intestazioni STL locali. Ora immagina di utilizzare localmente una versione STL ottimizzata per le prestazioni, pienamente compatibile con lo standard. Ad esempio, potresti aver scelto di intromettersi il buffer statico in ogni std::string
per ridurre il numero di allocazioni dinamiche e di mancate cache. Di conseguenza, il layout della memoria e / o la dimensione dell'implementazione sono diversi da quelli della libreria.
Se solo il layout è diverso, alcune funzioni membro std::string
chiamano su istanze passate dalla libreria al client o viceversa potrebbero non riuscire, a seconda di quali membri sono stati spostati.
Se anche la dimensione è diversa, tutti i tipi di libreria con std::string
membro avranno dimensioni diverse di quando sono registrati nella libreria e nel codice client. I membri di dati che seguono il membro std::string
avranno offset anche spostati, e qualsiasi accesso diretto / accessore in linea chiamato dal client restituirà spazzatura, nonostante "cerchi OK" durante il debug della libreria stessa.
Bottomline - se la libreria e il codice cliente sono compilati di nuovo con diverse std::string
versioni, si collegheranno bene, ma potrebbero risultare in alcuni bug sgradevoli e difficili da capire. Se si modifica l'implementazione di std::string
, tutte le librerie che espongono i membri da STL devono essere ricompilate in modo che corrispondano al layout std::string
del client. E poiché i programmatori vogliono che le loro librerie siano robuste raramente vedrai std::string
esposte ovunque.
Per essere onesti, questo vale per tutti i tipi di STL. IIRC non hanno un layout di memoria standarizzato.