Wie Google die Standard-C++-Bibliothek an seine Bedürfnisse anpasst
Stellen Sie sich vor, Sie schreiben Code für Systeme, die Milliarden von Anfragen verarbeiten. Die C++-Standardbibliothek (STL) ist gut, aber manchmal wird ihre Universalität zum Engpass. Irgendwo fehlt es an Hash-Tabellen-Performance, irgendwo fehlt eine komfortable Datumsbehandlung, und einige Features aus den neuen C++20- oder C++23-Standards möchten Sie jetzt sofort nutzen, ohne auf Compiler-Updates auf allen Servern zu warten.
Genau so ist Abseil entstanden. Es ist kein Ersatz für die STL, sondern eine Erweiterung, die Google in seinen internen Projekten wie Search, Ads und Maps verwendet. Entwickler haben einfach den Code genommen, der sich über Jahre bewährt hat, und ihn als Open Source veröffentlicht.
Was steckt in diesem Schweizer Taschenmesser
Wenn Sie sich das abseil-cpp-Repository ansehen, finden Sie dort Dutzende von Bibliotheken. Aber ich hebe diejenigen hervor, die die tägliche Entwicklung wirklich verändern.
Swiss Tables: wenn std::unordered_map zu langsam ist
In Abseil gibt es die Container-Familien absl::flat_hash_map und absl::flat_hash_set. Google nennt sie „Swiss Tables". Im Gegensatz zum Standard-std::unordered_map, das verkettete Listen für die Kollisionsauflösung verwendet, nutzt Abseil Open Addressing und SIMD-Anweisungen für die Suche. In der Praxis bietet dies einen spürbaren Geschwindigkeitsvorteil und Speicherersparnis durch bessere Cache-Lokalität.
Intelligente String-Behandlung
Die Bibliothek strings ist ein Lebensretter für alle, die es leid sind, Boilerplate für grundlegende Aufgaben zu schreiben. Zum Beispiel funktionieren absl::StrCat und absl::StrAppend schneller als die üblichen +- oder std::stringstream-Operatoren, da sie die erforderliche Puffergröße vorab berechnen und unnötige Allokationen vermeiden. Und mit absl::StrSplit können Sie Strings mit nur einer Codezeile und flexiblen Filtern aufteilen.
Fehlerbehandlung ohne Exceptions
Viele große Projekte deaktivieren Exceptions in C++ wegen des Overheads oder aus Sicherheitsgründen. In Abseil gibt es dafür absl::Status und absl::StatusOr<T>. Dies ist eine elegante Möglichkeit, entweder ein Ergebnis oder einen Fehlercode mit Textbeschreibung aus einer Funktion zurückzugeben. Wenn Sie schon einmal mit Go oder Rust gearbeitet haben, wird Ihnen dieser Ansatz sehr vertraut und logisch vorkommen.
Synchronisation und Zeit
Statt des Standard-std::mutex bieten sie absl::Mutex an. Es ist darauf ausgelegt, unter hoher Thread-Konkurrenz effizienter zu sein. Und die Bibliothek time macht das Arbeiten mit Zeitzonen und Intervallen viel einfacher als das überladene std::chrono.
Technische Philosophie: Live at Head
Abseil hat ein Merkmal, das entweder abschrecken oder anziehen kann. Google fördert das Konzept „Live at Head". Das bedeutet, dass sie empfehlen, das Projekt immer aus der neuesten Master-Version zu bauen.
Entwickler sind bemüht, die API nicht zu brechen, aber wenn es notwendig ist, die Bibliothek zu verbessern, werden sie es tun. Um das Leben der Benutzer zu erleichtern, wird Abseil mit Tools für automatische Code-Refactoring auf neue API-Versionen ausgeliefert. Für diejenigen, die nicht bereit für solche Abenteuer sind, gibt es LTS-Releases, aber der Hauptfokus liegt darauf, vorwärtszugehen.
Das Projekt unterstützt den Build mit Bazel und CMake. Wenn Sie bereits Bazel verwenden, dauert die Integration von Abseil nur ein paar Minuten.
Für wen ist das gedacht
Ich würde empfehlen, Abseil in zwei Fällen genauer anzusehen.
Erstens, wenn Sie ein hochbelastetes Backend schreiben. Das Ersetzen von Standard-Maps durch absl::flat_hash_map ergibt manchmal kostenlos einen Performance-Schub, ohne die Logik umzuschreiben.
Zweitens, wenn Sie auf einem alten C++-Standard feststecken (zum Beispiel C++17), aber unbedingt Features aus C++20 verwenden möchten. Abseil portet oft neue Sprachfähigkeiten zurück und macht sie auf älteren Compilern verfügbar.
Abseil ist nicht nur eine Sammlung von Utilities, sondern ein Spiegel dessen, wie Code in einem der technologisch fortschrittlichsten Unternehmen der Welt geschrieben wird. Die Bibliothek ist riesig, manchmal komplex, aber unglaublich hochwertig. Wenn Sie mehr brauchen als das, was die Standardbibliothek bietet, oder wenn Sie um jedes Prozent Performance kämpfen, ist dies definitiv ein Werkzeug, das in Ihrem Arsenal nicht fehlen sollte.
Der beste Weg, um mit dem Lernen zu beginnen, ist der offizielle Leitfaden, da die README im Repository recht kurz ist und eher als Karte der Projektordner dient.
Ähnliche Projekte