Должен ли я использовать PIMPL везде?
Мой текущий проект включает в себя написание C++ API, и я решил использовать идиому PIMPL.
Должен ли я использовать идиому PIMPL везде в моем проекте, например, мне нужно создать собственный класс, который наследуется от std::exception
Должен ли я проектировать этот класс с учетом идиомы PIMPL или я могу просто написать как публичную реализацию?
Неправильно полагать, что только потому, что я использую идиому PIMPL, каждый класс, который я создаю, должен быть разработан вокруг него. Существуют ли исключения, когда PIMPL не следует использовать?
2 ответа
Если вы пишете API/ библиотеку, вопрос заключается в том, что является основным преимуществом для пользователей вашего API и даже какие IDE и инструменты они будут использовать для работы с вашим API. Ключевыми моментами для использования PIMPL являются:
- Вы действительно хотите скрыть реализацию от пользователей (у вас есть большое количество приватных методов и полей и очень простой публичный интерфейс).
- Вы хотите абстрагировать их от зависимого от платформы кода.
- Вы хотите сократить время их сборки.
Вы не должны использовать PIMPL, когда виртуальные вызовы или какие-либо косвенные действия слишком дорого обходятся вашим пользователям во время работы их программ:
- Последовательности повторных небольших вызовов функций (и вы не можете удалить их с уровня API).
- Создание и удаление большого количества мелких объектов (и вы не можете удалить его с уровня API).
PIMPL имеет расходы.
Поэтому это хорошая идея, когда вам это действительно нужно, например, содержать заголовок C, который использует ключевые слова C++ в качестве имен, или который, например, определяет zillion макросы.
Некоторые (в том числе Herb) защищают или, по крайней мере, не спорят с использованием PIMPL исключительно для сокращения времени сборки, но другие меры, такие как использование аппаратного обеспечения для решения проблемы, могут быть менее затратными.