Указатель на функцию __attribute __ ((const))? - PullRequest
9 голосов
/ 25 февраля 2012

Как (в GCC / "GNU C") вы объявляете указатель на функцию, которая указывает на функцию __attribute__((const))?Идея заключается в том, что я хочу, чтобы компилятор избегал генерации нескольких вызовов функции, вызываемой через указатель функции, когда он может кэшировать возвращаемое значение из предыдущего вызова.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012
typedef void (*t_const_function)(void) __attribute__((const));

static __attribute__((const)) void A(void) {
}

static void B(void) {
}

int main(int argc, const char* argv[]) {
    t_const_function a = A;

    // warning: initialization makes qualified
    // function pointer from unqualified:
    t_const_function b = B;

    return 0;
}

Или просто:

__attribute__((const)) void(*a)(void) = A;
0 голосов
/ 25 февраля 2012

Хотя это не совсем ответ на ваш вопрос, вы, вероятно, хотите знать следующее:

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

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

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

...