Ir para o conteúdo

Ú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:

class X
{
private:
  C c;
  D d;  
} ;

Transformado em pImpl, fica assim

class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};

Definição no CPP:

struct X::XImpl
{
  C c;
  D d;
};
  • 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

Comentários