Oltre ai motivi pubblicati qui, ce n'è anche un altro: la compatibilità binaria . Gli autori delle librerie non hanno alcun controllo su quale std::string
implementazione si sta utilizzando e se ha lo stesso layout di memoria della 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, è possibile che si sia scelto di inserire un buffer statico in ciascuno std::string
di essi per ridurre il numero di allocazioni dinamiche e errori nella cache. Di conseguenza, il layout e / o la dimensione della memoria dell'implementazione sono diversi da quelli della libreria.
Se solo il layout è diverso, alcune std::string
funzioni dei membri richiamano 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 che hanno std::string
membri appariranno di dimensioni diverse quando vengono controllati nella libreria e nel codice client. Anche i membri di dati che seguono il std::string
membro avranno gli offset spostati, e qualsiasi accesso diretto / accessorio in linea chiamato dal client restituirà spazzatura, nonostante "sembri OK" durante il debug della libreria stessa.
In conclusione: se la libreria e il codice client vengono compilati di nuovo in std::string
versioni diverse , si collegheranno perfettamente, ma potrebbe risultare in alcuni bug cattivi e difficili da capire. Se si modifica l' std::string
implementazione, è necessario ricompilare tutte le librerie che espongono i membri da STL in modo che corrispondano al std::string
layout del client . E poiché i programmatori vogliono che le loro librerie siano robuste, raramente le vedrai std::string
esposte ovunque.
Ad essere onesti, questo vale per tutti i tipi di STL. IIRC non hanno layout di memoria standardizzati.