Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API