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

Опубликовано: 16 Декабря, 2021

Функция называется чистой функцией, если она всегда возвращает один и тот же результат для одних и тех же значений аргументов и не имеет побочных эффектов, таких как изменение аргумента (или глобальной переменной) или вывод чего-либо. Единственный результат вызова чистой функции - это возвращаемое значение. Примеры чистых функций: 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. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать больше о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровней C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .