Рубрики

Чистые функции

Функция называется чистой функцией, если она всегда возвращает один и тот же результат для одинаковых значений аргумента и не имеет побочных эффектов, таких как изменение аргумента (или глобальной переменной) или вывод чего-либо. Единственный результат вызова чистой функции — возвращаемое значение. Примерами чистых функций являются strlen (), pow (), sqrt () и т. Д. Примерами нечистых функций являются printf (), rand (), time () и т. Д.

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

__attribute__ ((pure)) return-type fun-name(arguments1, …)
{
    /* function body */
}

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

__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 и генерирует код следующим образом.

int len = strlen(str);

  

for (i = 0; i < len; ++i)

    printf("%c", toupper((str[i]));

Давайте напишем нашу собственную чистую функцию для вычисления длины строки.

__attribute__ ((pure)) size_t my_strlen(const char *str)

{

    const char *ptr = str;

    while (*ptr)

       ++ptr;

  

    return (ptr – str);

}

Маркировка функции как чистой говорит о том, что гипотетическая функция «my_strlen ()» безопасна для вызова меньше раз, чем говорит программа.

Эта статья составлена Narendra Kangralkar и рецензирована командой GeeksforGeeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Чистые функции

0.00 (0%) 0 votes