Última atualização:2026-10-12
Idiom Pimpl em C++¶
"Pointer to implementation", ou "pImpl", é uma técnica de programação em C++ que remove os detalhes de implementação de uma classe da representação do objeto, colocando-os em uma classe separada, acessada por meio de um ponteiro opaco.
Os motivos para usar o idiom pImpl são os seguintes:
Considere o exemplo abaixo:
Transformado em pImpl, fica assim
Definição no CPP:
- Compatibilidade binária
Ao desenvolver uma biblioteca, é possível adicionar/modificar campos em XImpl sem quebrar a compatibilidade binária com os clientes (o que causaria uma falha!). Como o layout binário da classe X não muda quando novos campos são adicionados à classe XImpl, é seguro acrescentar novas funcionalidades à biblioteca em atualizações de versão secundária.
Naturalmente, você também pode adicionar novos métodos públicos/privados não virtuais a X/XImpl sem quebrar a compatibilidade binária, mas isso é comparável à técnica padrão de cabeçalho/implementação.
- Ocultação de dados
Se você está desenvolvendo uma biblioteca, especialmente uma proprietária, talvez não queira expor outras bibliotecas/técnicas de implementação usadas para implementar a interface pública da sua. Seja por questões de propriedade intelectual, seja porque você acredita que os usuários podem ser tentados a fazer suposições perigosas sobre a implementação, ou simplesmente a quebrar o encapsulamento usando truques de conversão temíveis. O PIMPL resolve/mitiga esse dilema.
- Tempo de compilação
O tempo de compilação diminui, porque, quando você adiciona/remove campos e/ou métodos à classe XImpl (o que, na técnica padrão, corresponde a adicionar campos/métodos privados), apenas o arquivo-fonte (de implementação) de X precisa ser reconstruído. Na prática, essa é uma operação comum.
Com a técnica padrão de cabeçalho/implementação (sem PIMPL), quando você adiciona um novo campo a X, todo cliente que já alocou X (na pilha ou no heap) precisa recompilar, pois precisa ajustar o tamanho da alocação. Bem, todo cliente que nunca alocou X também precisa recompilar, mas isso é apenas overhead (o código resultante no cliente é o mesmo).
https://stackoverflow.com/questions/8972588/is-the-pimpl-idiom-really-used-in-practices
Tópicos relacionados¶
- C++ evitar o construtor padrão | C++那些事
- Idiom de lista de inicialização de classes em C++ | C++那些事
- C++: templates de classe em vez de templates de função | C++那些事
- Idiom copy-and-swap em C++ | C++那些事
- Injeção de dependência em C++ | C++那些事
- C++ enum class enumerações fortemente tipadas | C++那些事
- C++ Header-Only versus separação de implementação | C++那些事
- Idiom de avaliação preguiçosa em C++ | C++那些事
- Idiom de consulta em tabela em C++ | C++那些事
- Ponteiros para membros e type info em C++ | C++那些事