📜  纯函数

📅  最后修改于: 2021-05-20 06:04:37             🧑  作者: Mango

如果函数始终为相同的参数值返回相同的结果,并且没有诸如修改参数(或全局变量)或输出某些内容之类的副作用,则该函数称为纯函数。调用纯函数的唯一结果就是返回值。纯函数的示例为strlen(),pow(),sqrt()等。不纯函数的示例为printf(),rand(),time()等。

如果一个函数对于编译器而言是纯函数,则可以对其进行循环优化和子表达式消除。在GCC中,我们可以使用“纯”属性将函数标记为纯函数。

__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()”可以安全地调用少于程序所说的次数。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”