Использование массива указателей на функции вместо switch - PullRequest
0 голосов
/ 08 ноября 2019

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

// Declaritons of add-substract-multiply funcitons

void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply}; 
unsigned int ch, a = 15, b = 10; 

printf("Enter Choice: 0 for add, 1 for subtract and 2 "
        "for multiply\n"); 
scanf("%d", &ch); 

if (ch > 2) return 0; 

(*fun_ptr_arr[ch])(a, b); 

, и мне интересно, что было бы лучше, если бы этот код был лучше с использованием переключателя? (с точки зрения производительности между прочим)

1 Ответ

0 голосов
/ 08 ноября 2019
Оператор

A switch с соседними числами часто оптимизируется внутри таблицы поиска указателя функции.

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

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

Например, обычная практика - использовать такие таблицы указателей функций при реализации конечных автоматов. С другой стороны, сложные switch операторы трудны для чтения, и существуют различные причуды с синтаксисом, такие как отсутствующая ошибка break и т. Д.

Наконец, вы можете улучшить читабельность своего кода, если выНапишите так:

typedef void operation_t (int op1, int op2);  // function type

operation_t* const op_array[] = {add, subtract, multiply}; // read-only function pointer table

op_array[i](a, b); // call specific function
...