8.6 Извлечение указателя на функцию из связанного указателя на функцию-член
В C++ указатели на функции-члены (PMF) реализованы с помощью своего рода широкого указателя, чтобы обрабатывать все возможные механизмы вызова; PMF должен хранить информацию о том, как корректировать указатель «this», а также, если функция является виртуальной, где находится vtable и где в vtable искать функцию-член. Если вы используете PMF во внутреннем цикле, вам действительно стоит пересмотреть это решение. Если это невозможно, можно извлечь указатель на функцию, которая будет вызвана для заданной пары «объект/PMF», и вызывать её напрямую во внутреннем цикле, чтобы немного сэкономить время.
Обратите внимание, что за вызов через указатель на функцию всё равно приходится платить; в большинстве современных архитектур такой вызов лишает процессор возможности использовать предсказание переходов. То же самое верно и для обычных вызовов виртуальных функций.
Синтаксис этого расширения:
extern A a; extern int (A::*fp)(); typedef int (*fptr)(A *); fptr p = (fptr)(a.*fp);
Для констант PMF (то есть выражений вида «&Klasse::Member») объект для получения адреса функции не нужен. Их можно напрямую преобразовать в указатели на функции:
fptr p1 = (fptr)(&A::foo);
Чтобы использовать это расширение, необходимо указать -Wno-pmf-conversions.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Bound-member-functions.html