Como o Google personaliza a biblioteca padrão C++ para suas necessidades
Imagine escrever código para sistemas que processam bilhões de requisições. A Biblioteca Padrão C++ (STL) é boa, mas às vezes sua universalidade se torna um gargalo. Em algum lugar falta desempenho de tabelas hash, em algum lugar falta manipulação conveniente de datas, e alguns recursos dos novos padrões C++20 ou C++23 que você quer usar agora, sem esperar por atualizações do compilador em todos os servidores.
Foi exatamente assim que o Abseil surgiu. Não é uma substituição da STL, mas uma extensão que o Google usa em seus projetos internos como Search, Ads e Maps. Os desenvolvedores simplesmente pegaram o código comprovado ao longo de anos e o lançaram como código aberto.
O que tem dentro dessa faca suíça
Se você explorar o repositório abseil-cpp, encontrará dezenas de bibliotecas. Mas vou destacar aquelas que realmente mudam o desenvolvimento cotidiano.
Swiss Tables: quando std::unordered_map é lento demais
No Abseil existem famílias de contêineres absl::flat_hash_map e absl::flat_hash_set. O Google as chama de "Swiss tables". Diferentemente do std::unordered_map padrão, que usa listas encadeadas para resolução de colisões, o Abseil usa open addressing e instruções SIMD para busca. Na prática, isso proporciona um aumento perceptível de velocidade e economia de memória devido à melhor locality de cache.
Manipulação inteligente de strings
A biblioteca strings é uma salvação para quem está cansado de escrever boilerplate para tarefas básicas. Por exemplo, absl::StrCat e absl::StrAppend funcionam mais rápido que os operadores usuais + ou std::stringstream porque pré-calculam o tamanho do buffer necessário e evitam alocações desnecessárias. E absl::StrSplit permite dividir strings com apenas uma linha de código com filtros flexíveis.
Tratamento de erros sem exceções
Muitos projetos grandes desabilitam exceções em C++ devido à sobrecarga ou preocupações com segurança. No Abseil existem absl::Status e absl::StatusOr<T> para isso. Esta é uma forma elegante de retornar um resultado ou um código de erro com descrição textual de uma função. Se você já trabalhou com Go ou Rust, essa abordagem parecerá muito familiar e lógica para você.
Sincronização e tempo
Em vez do std::mutex padrão, eles oferecem absl::Mutex. Ele foi projetado para ser mais eficiente sob alta contenção de threads. E a biblioteca time torna o trabalho com fusos horários e intervalos muito mais simples do que o std::chrono sobrecarregado.
Filosofia técnica: Live at Head
O Abseil tem uma característica que pode tanto afastar quanto atrair. O Google promove o conceito "Live at Head". Isso significa que eles recomendam sempre compilar o projeto a partir da versão master mais recente.
Os desenvolvedores se esforçam para não quebrar a API, mas se for necessário melhorar a biblioteca, eles farão isso. Para facilitar a vida dos usuários, o Abseil vem com ferramentas para refatoração automática de código para novas versões da API. Para quem não está pronto para essas aventuras, existem lançamentos LTS, mas o foco principal é avançar.
O projeto suporta construção com Bazel e CMake. Se você já usa o Bazel, integrar o Abseil levará apenas alguns minutos.
Para quem isso é útil
Eu recomendaria dar uma olhada mais de perto no Abseil em dois casos.
Primeiro, se você está escrevendo um backend de alta carga. Substituir mapas padrão por absl::flat_hash_map às vezes dá um aumento de desempenho de graça, sem reescrever lógica.
Segundo, se você está preso a um padrão antigo de C++ (por exemplo, C++17), mas realmente quer usar recursos do C++20. O Abseil frequentemente faz backport de novos recursos da linguagem, tornando-os disponíveis em compiladores mais antigos.
O Abseil não é apenas uma coleção de utilitários, mas um reflexo de como o código é escrito em uma das empresas mais tecnologicamente avançadas do mundo. A biblioteca é enorme, às vezes complexa, mas incrivelmente de alta qualidade. Se você precisa de mais do que a biblioteca padrão oferece ou está lutando por cada por cento de desempenho, esta é definitivamente uma ferramenta que vale a pena ter no seu arsenal.
A melhor maneira de começar a aprender é com o guia oficial, já que o README no repositório é bastante breve e serve mais como um mapa das pastas do projeto.
Projetos relacionados