Может ли gcc встроить косвенный вызов функции через постоянный массив указателей на функции? - PullRequest
2 голосов
/ 24 февраля 2011

Допустим, у нас есть этот код:

inline int func_2 (int a, int b) {
  return time() + a * b;
}

int main (void) {
  int x = (int (*[])(int, int)){func_1, func_2, func_3}[1](6, 7);
}

Можно ли каким-то образом обмануть gcc, чтобы действительно встроить косвенные вызовы func_*?

После компиляции кода с помощью -O2 и-O3, я все еще могу обнаружить инструкцию call func_2 в выводе сборки.

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

1 Ответ

3 голосов
/ 24 февраля 2011

, если вам не помешает выделить место в сегменте данных, вы можете попробовать так:

static int func_2 (int a, int b) {
    return time() + a * b;
}

static int (* const ftab[])(int,int) = {func_1, func_2, func_3};

int foo (void) {
    return ftab[1](6,7);
}

Мой gcc 4.4.5 правильно указывает на функцию с -O2.

Агрегатный инициализатор внутри кода функции не пересылает константу, как мы ожидаем, я не знаю, является ли это ошибкой gcc или нашим неправильным пониманием какого-то правила C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...