Última actualización:2026-10-12
C++ Idioma pImpl¶
El «puntero a la implementación» o «pImpl» es una técnica de programación en C++ que saca los detalles de implementación de una clase fuera de la representación del objeto, los coloca en una clase separada y accede a ellos mediante un puntero opaco.
Las razones para usar el idioma pImpl son las siguientes:
Consideremos el siguiente ejemplo:
Convertido a pImpl queda así
Definición del CPP:
- Compatibilidad binaria
Al desarrollar una biblioteca se pueden añadir o modificar campos de XImpl sin romper la compatibilidad binaria con los clientes (¡romperla provocaría fallos!). Como la disposición binaria de la clase X no cambia al añadir nuevos campos a la clase XImpl, se pueden añadir de forma segura nuevas funcionalidades a la biblioteca en actualizaciones menores.
Por supuesto, también puede añadir nuevos métodos públicos o privados no virtuales a X / XImpl sin romper la compatibilidad binaria, pero eso es equiparable a la técnica estándar de cabecera/implementación.
- Ocultación de datos
Si está desarrollando una biblioteca, en especial una propietaria, puede que no quiera exponer otras bibliotecas o técnicas de implementación usadas para implementar la interfaz pública de la suya, ya sea por cuestiones de propiedad intelectual, porque considere que los usuarios podrían verse tentados de hacer suposiciones peligrosas sobre la implementación, o simplemente porque rompan la encapsulación usando trucos temibles de conversión de tipos. PIMPL resuelve o mitiga este dilema.
- Tiempo de compilación
El tiempo de compilación se reduce, porque cuando añade o elimina campos y/o métodos de la clase XImpl (lo que en la técnica estándar se corresponde con añadir campos/métodos privados) solo hace falta recompilar el archivo fuente (de implementación) de X. En la práctica, esta es una operación habitual.
Con la técnica estándar de cabecera/implementación (sin PIMPL), cuando añade un campo nuevo a X, cada cliente que alguna vez haya asignado X (en la pila o en el montón) debe recompilarse, porque tiene que ajustar el tamaño de la asignación. Bueno, también todo cliente que nunca haya asignado X necesita recompilarse, pero eso es solo sobrecoste (el código resultante en el cliente es el mismo).
https://stackoverflow.com/questions/8972588/is-the-pimpl-idiom-really-used-in-practices
Temas relacionados¶
- C++ Evitar el constructor por defecto | C++那些事
- C++ Idioma de la lista de inicialización de clases | C++那些事
- C++: plantillas de clase antes que plantillas de función | C++那些事
- C++ Idioma copy-and-swap | C++那些事
- C++ Inyección de dependencias | C++那些事
- C++ enum class enumeraciones fuertemente tipadas | C++那些事
- C++ Header-Only frente a separación de implementación | C++那些事
- C++ Idioma de evaluación perezosa | C++那些事
- C++ Idioma de la tabla de consulta | C++那些事
- C++ Punteros a miembros e información de tipos | C++那些事