Чистые функции
Функция называется чистой функцией, если она всегда возвращает один и тот же результат для одних и тех же значений аргументов и не имеет побочных эффектов, таких как изменение аргумента (или глобальной переменной) или вывод чего-либо. Единственный результат вызова чистой функции - это возвращаемое значение. Примеры чистых функций: strlen (), pow (), sqrt () и т. Д. Примеры нечистых функций: printf (), rand (), time () и т. Д.
Если функция известна компилятору как чистая, то к ней можно применить оптимизацию цикла и исключение подвыражений. В GCC мы можем помечать функции как чистые с помощью атрибута «pure».
__attribute__ ((чистый)) возвращаемый тип fun-name (arguments1,…) { / * тело функции * / }
Ниже приведен пример чистой функции, которая возвращает квадрат переданного целого числа.
__attribute__ _((pure)) int my_square( int val) { return val*val; } |
Рассмотрим приведенный ниже пример
for (len = 0; len < strlen (str); ++len) printf ( "%c" , toupper (str[len])); |
Если функция «strlen ()» не отмечена как чистая функция, то компилятор будет вызывать функцию «strlen ()» при каждой итерации цикла, а если функция отмечена как чистая функция, компилятор знает это значение «strlen ()». функция будет одинаковой для каждого вызова, поэтому компилятор оптимизирует цикл for и генерирует следующий код.
Напишем нашу собственную чистую функцию для вычисления длины строки.
__attribute__ ((pure)) size_t my_strlen( const char *str) { const char *ptr = str; while (*ptr) ++ptr; return (ptr – str); } |
Пометка функции как чистой говорит о том, что гипотетическую функцию my_strlen () можно безопасно вызывать меньшее количество раз, чем указано в программе.
Эта статья составлена «Нарендрой Кангралкар» и проверена командой GeeksforGeeks. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.