2013-04-06 4 views
4

Я скажу, например, что у меня есть функция, называемая int compute (int x1, int x2, int (* op) (int, int)), которая принимает в качестве аргумента функцию указатель на функцию, которая выполняет некоторые арифметические операцииПреимущество указателей функций над флагами

int add (int a1, int a2) 
{ 
    return (a1 + a2); 
} 
int mul (int s1, int s2) 
{ 
    return (s1 * s2); 
} 
int compute (int x1, int x2, int (* op) (int, int)) 
{ 
    return (op (x1, x2)); 
} 
main() 
{ 
    int result; 
    int op1, op2; 
    op1 = 4; 
    op2 = 5; 
    result = compute (op1, op2, &add()); 
    result = compute (op1, op2, &mul()); 
} 

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

int compute (int x1, int x2, int opFlag) 
{ 
    if (opFlag == 1) 
     return (add (x1, x2);); 
    if (opFlag == 2) 
     return (mul (x1, x2);); 
    return 1; 
} 

main() 
{ 
    int result; 
    int op1, int op2; 

    op1 = 4; 
    op2 = 5; 

    result = compute (op1, op2, 1); 
    result = compute (op1, op2, 2); 
} 

Теперь вопрос, каковы (объявление/disad) недостатков; по «указателя функции» подход против «простого подхода флага» с точки зрения эффективности, размер кода, портативность, читаемость и т.д. .,?

+2

Если вы используете флаги, и если вы хотите добавить больше функций, вы должны изменить код, чтобы добавить еще ' if'. –

+3

С помощью указателя функции вы можете передавать другие алгоритмы без изменения или перекомпиляции 'compute'. –

+1

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

ответ

1

какова (объявление/disad) о недостатках; «указатель функции» подход против «простого подхода флага» с точкой зрения эффективности,

Меньшее вызовы могут быть быстрее. На многих процессорах вызовы функций имеют заметную стоимость, когда вы их много.

размер кода,

Меньшее функции могут быть меньше, поскольку вы не дублируется накладных расходов функции пролог и эпилог кода.

портативность,

не применяется до тех пор, как ваш код правильно, не страдает от неопределенного поведения и не зависит от реализации определенного/конкретного поведения.

читаемость

Может быть субъективным. Часто, меньше слоев абстракции и меньше косвенностей легче понять, чем больше.

и т.п.,?

etc.

0

Что делать, когда вы хотите добавить новую операцию?

указатели на функции позволяют (или ваши библиотеки будущие клиенты) сделать это без изменения функции вычислений

Смежные вопросы