Abgesehen von den hier genannten Gründen gibt es noch eine andere - die binäre Kompatibilität . Die Autoren der Bibliotheken haben keine Kontrolle darüber, welche std::string
Implementierung Sie verwenden und ob sie das gleiche Speicherlayout wie ihre haben.
std::string
Ist eine Vorlage, so wird ihre Implementierung von Ihren lokalen STL-Headern übernommen. Stellen Sie sich nun vor, Sie verwenden lokal eine leistungsoptimierte STL-Version, die vollständig mit dem Standard kompatibel ist. Beispielsweise haben Sie sich möglicherweise dafür entschieden, statischen Puffer in jeden einzufügen std::string
, um die Anzahl der dynamischen Zuweisungen und Cache- Fehler zu verringern. Infolgedessen unterscheidet sich das Speicherlayout und / oder die Größe Ihrer Implementierung von denen der Bibliothek.
Wenn sich nur das Layout unterscheidet, schlagen einige std::string
Memberfunktionsaufrufe für Instanzen, die von der Bibliothek an den Client übergeben wurden, möglicherweise fehl, je nachdem, welche Member verschoben wurden.
Wenn auch die Größe unterschiedlich ist, std::string
scheinen alle Bibliothekstypen, die ein Mitglied haben, eine unterschiedliche Größe zu haben, wenn sie in der Bibliothek und im Client-Code markiert sind. Bei Datenmitgliedern, die dem Mitglied folgen, std::string
werden die Offsets ebenfalls verschoben, und jeder vom Client aufgerufene Direktzugriffs- / Inline-Accessor gibt den Müll zurück, obwohl beim Debuggen der Bibliothek "OK" angezeigt wird.
Fazit: Wenn die Bibliothek und der Client-Code in verschiedenen std::string
Versionen kompiliert werden, sind die Verknüpfungen in Ordnung. Dies kann jedoch zu bösen, schwer verständlichen Fehlern führen. Wenn Sie Ihre std::string
Implementierung ändern , müssen alle Bibliotheken, die Mitglieder aus STL verfügbar machen, neu kompiliert werden, um dem std::string
Layout des Clients zu entsprechen . Und weil Programmierer möchten, dass ihre Bibliotheken robust sind, werden Sie sie selten std::string
irgendwo sichtbar sehen.
Um fair zu sein, gilt dies für alle STL-Typen. IIRC haben sie nicht standardisiertes Speicherlayout.