C++ Pimpl vs Чистая производительность виртуального интерфейса

Я понимаю, что есть довольно много сообщений на эту тему, но мне трудно найти ответ на этот конкретный вопрос.

Для вызовов функций, который быстрее, чисто виртуальный интерфейс или pimpl?

На первый взгляд, мне кажется, что чисто виртуальный интерфейс будет быстрее, потому что использование pimpl обойдется в два вызова функций вместо одного... или в этом случае вступит в силу какой-нибудь хитрый трюк с компилятором?

редактировать: я пытаюсь решить, какой из них я должен использовать, чтобы абстрагироваться от системно-зависимых частей нескольких объектов, которые могут в конечном итоге появляться довольно часто и в больших количествах.

редактировать:
Я полагаю, что на данный момент стоит сказать, что корень моей проблемы заключался в том, что я принял шаблон проектирования Abstract Factory для метода, позволяющего заставить мой код работать на нескольких платформах, когда его реальная цель - переключение реализаций для данного интерфейса во время выполнения.,

2 ответа

Решение

Эти два варианта не эквивалентны, их не следует сравнивать по производительности, поскольку фокусировка различна. Даже если бы они были эквивалентны, разница в производительности была бы минимальной или незначительной в большинстве ситуаций. Если вы в редком случае знаете, что отправка является проблемой, то у вас есть инструменты, чтобы измерить разницу самостоятельно.

Почему ты справшиваешь? Вопрос, кажется, не имеет смысла.

Обычно используют виртуальные функции, когда хотят полиморфизма: когда вы хотите, чтобы они были переопределены в производных классах.

Обычно используется pimpl, когда требуется удалить детали реализации из заголовочных файлов.

Два действительно не являются взаимозаменяемыми. Вдобавок ко всему, я не могу придумать какие-либо разумные ситуации, когда вы бы использовали одну из них и решили заменить ее другой.


В любом случае, для обычной реализации виртуальных функций вызов функции включает в себя чтение объекта, чтобы найти указатель таблицы виртуальных функций, затем чтение таблицы виртуальных функций, чтобы найти указатель функции, и, наконец, вызов указателя функции.

Для класса, реализованного с помощью pimpl, один вызов функции является принудительным, но он может быть абсолютно любым "под капотом". Несмотря на то, что вы предлагаете, парадигма не подразумевает никакого второго вызова функции.


Наконец, не забывайте, что применяются обычные рекомендации по оптимизации: вы должны реально реализовать и измерить. Попытка "придумать" ответ имеет тенденцию приводить к плохим результатам даже у людей, имеющих опыт в подобных вещах.

И, конечно же, самое важное правило оптимизации: убедитесь, что что-то имеет значение, прежде чем уделять много времени попыткам его оптимизации. В противном случае вы будете тратить много времени и энергии.

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