Должен ли я использовать 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 исключительно для сокращения времени сборки, но другие меры, такие как использование аппаратного обеспечения для решения проблемы, могут быть менее затратными.

Другие вопросы по тегам