>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
C-plus-plus

Come Google personalizza la libreria standard C++ per le proprie esigenze

Immaginate di scrivere codice per sistemi che elaborano miliardi di richieste. La libreria standard C++ (STL) è buona, ma a volte la sua universalità diventa un collo di bottiglia. Da qualche parte manca la performance delle tabelle hash, da qualche altra parte manca una comoda gestione delle date, e alcune funzionalità dei nuovi standard C++20 o C++23 che vorreste usare subito, senza aspettare gli aggiornamenti del compilatore su tutti i server.

È esattamente così che è nato Abseil. Non è un sostituto della STL, ma un'estensione che Google utilizza nei suoi progetti interni come Search, Ads e Maps. Gli sviluppatori hanno semplicemente preso il codice provato nel corso degli anni e lo hanno rilasciato come open source.

Cosa c'è dentro questo coltellino svizzero

Se date un'occhiata al repository abseil-cpp, troverete decine di librerie. Ma io evidenzierò quelle che cambiano davvero lo sviluppo quotidiano.

Swiss Tables: quando std::unordered_map è troppo lento

In Abseil ci sono le famiglie di container absl::flat_hash_map e absl::flat_hash_set. Google le chiama "Swiss tables". A differenza del normale std::unordered_map, che utilizza liste collegate per la risoluzione delle collisioni, Abseil utilizza l'indirizzamento aperto e istruzioni SIMD per la ricerca. In pratica, questo fornisce un notevole incremento di velocità e un risparmio di memoria grazie a una migliore località della cache.

Gestione intelligente delle stringhe

La libreria strings è una manna per chi è stanco di scrivere boilerplate per compiti base. Ad esempio, absl::StrCat e absl::StrAppend funzionano più velocemente dei soliti operatori + o std::stringstream perché precalcolano la dimensione del buffer necessario ed evitano allocazioni non necessarie. E absl::StrSplit vi permette di dividere le stringhe con una sola riga di codice con filtri flessibili.

Gestione degli errori senza eccezioni

Molti progetti di grandi dimensioni disabilitano le eccezioni in C++ per il sovraccarico o problemi di sicurezza. In Abseil ci sono absl::Status e absl::StatusOr<T> per questo. È un modo elegante per restituire da una funzione un risultato o un codice di errore con descrizione testuale. Se avete mai lavorato con Go o Rust, questo approccio vi sembrerà molto familiare e logico.

Sincronizzazione e tempo

Al posto del standard std::mutex, offrono absl::Mutex. È progettato per essere più efficiente sotto alta contesa di thread. E la libreria time rende il lavoro con i fusi orari e gli intervalli molto più semplice rispetto al sovraccarico std::chrono.

Filosofia tecnica: Live at Head

Abseil ha una caratteristica che può either respingere o attrarre. Google promuove il concetto di "Live at Head". Questo significa che raccomandano di buildare sempre il progetto dall'ultima versione master.

Gli sviluppatori si sforzano di non rompere l'API, ma se è necessario migliorare la libreria, lo faranno. Per facilitare la vita agli utenti, Abseil include strumenti per il refactoring automatico del codice verso nuove versioni dell'API. Per chi non è pronto per tali avventure, ci sono rilascii LTS, ma l'attenzione principale è sul muoversi in avanti.

Il progetto supporta la build con Bazel e CMake. Se state già usando Bazel, integrare Abseil richiederà solo un paio di minuti.

A chi è rivolto

Raccomanderei di dare un'occhiata più da vicino ad Abseil in due casi.

Primo, se state scrivendo un backend ad alto carico. Sostituire le mappe standard con absl::flat_hash_map a volte dà un incremento di performance gratis, senza riscrivere la logica.

Secondo, se siete bloccati su un vecchio standard C++ (per esempio, C++17), ma vorreste davvero usare funzionalità del C++20. Abseil spesso backporta nuove capacità del linguaggio, rendendole disponibili su compilatori più vecchi.

Abseil non è solo una raccolta di utility, ma un riflesso di come viene scritto il codice in una delle aziende tecnologicamente più avanzate al mondo. La libreria è enorme, a volte complessa, ma incredibilmente di alta qualità. Se avete bisogno di più di ciò che offre la libreria standard o state lottando per ogni percento di prestazioni, questo è sicuramente uno strumento che vale la pena avere nel vostro arsenale.

Il modo migliore per iniziare ad imparare è con la guida ufficiale, dato che il README nel repository è piuttosto breve e serve più come mappa delle cartelle del progetto.

Progetti correlati