Biblioteca frozen para C++: Guia Completo de Contêineres em Tempo de Compilação
A biblioteca frozen é uma biblioteca header-only para C++17 e versões posteriores, que fornece contêineres (map, set, string) totalmente inicializados em tempo de compilação (compile-time). Ela permite criar estruturas de dados imutáveis que não exigem alocação dinâmica de memória durante a execução. É a solução ideal para sistemas embarcados, motores de jogos, servidores de alta carga e qualquer código onde desempenho e previsibilidade de tempo de execução sejam críticos.
A ideia principal do frozen é que você define o contêiner como constexpr ou constinit, e todo o trabalho de ordenação, hashing e construção da estrutura de dados ocorre durante a compilação. Em tempo de execução, você obtém um contêiner pronto e otimizado que opera com sobrecarga mínima. Por exemplo, frozen::map usa busca binária em um array ordenado, enquanto frozen::unordered_map usa hashing perfeito (perfect hashing), garantindo acesso O(1) sem colisões.
Para desenvolvedores C++, isso significa: sem memória dinâmica (sem new/delete), sem exceções (noexcept), segurança total em threads (já que os dados são somente leitura) e a possibilidade de colocar contêineres na memória flash de microcontroladores. A biblioteca é amplamente utilizada em projetos do Facebook (agora Meta), em compiladores e em núcleos de sistemas operacionais.
Instalação
A biblioteca frozen é header-only, portanto a instalação se resume a copiar os arquivos de cabeçalho para o seu projeto. A maneira mais simples é usar Conan ou CMake FetchContent. Abaixo estão os comandos exatos para diferentes gerenciadores de pacotes.
Instalação via Conan (recomendado)
conan install frozen/1.1.1@ -r conancenter
# Em seguida, adicione no CMakeLists.txt:
# find_package(frozen REQUIRED)
# target_link_libraries(seu_target frozen::frozen)
Instalação via vcpkg
vcpkg install frozen
# Após a instalação, use:
# find_package(frozen CONFIG REQUIRED)
# target_link_libraries(seu_target frozen::frozen)
Instalação via CMake FetchContent (sem gerenciador de pacotes)
include(FetchContent)
FetchContent_Declare(
frozen
GIT_REPOSITORY https://github.com/serge-sans-paille/frozen.git
GIT_TAG v1.1.1
)
FetchContent_MakeAvailable(frozen)
target_link_libraries(seu_target frozen::frozen)
Instalação manual (header-only)
git clone https://github.com/serge-sans-paille/frozen.git
# Copie a pasta frozen/include/frozen para o seu projeto
# Adicione o caminho de include ao compilador:
# g++ -I/caminho/para/frozen/include seu_arquivo.cpp -std=c++17
Início Rápido: Exemplo Mínimo Funcional
Crie um arquivo exemplo.cpp com o seguinte conteúdo:
#include <iostream>
#include <frozen/unordered_map.h>
#include <frozen/string.h>
int main() {
// Cria um map em tempo de compilação com hashing perfeito
constexpr frozen::unordered_map<frozen::string, int, 3> calorias_frutas = {
{"maca", 95},
{"banana", 105},
{"laranja", 62}
};
// Busca em tempo de execução — O(1), sem colisões
std::cout << "Calorias da banana: " << calorias_frutas.at("banana") << "\n";
// Verifica se a chave existe
if (auto it = calorias_frutas.find("uva"); it != calorias_frutas.end()) {
std::cout << "Uva encontrada: " << it->second << "\n";
} else {
std::cout << "Uva não encontrada\n";
}
// Iteração sobre todos os elementos
for (auto& [fruta, calorias] : calorias_frutas) {
std::cout << fruta.data() <<