纯函数

函数被调用 纯函数 如果它总是为相同的参数值返回相同的结果,并且没有任何副作用,比如修改参数(或全局变量)或输出某些东西。调用纯函数的唯一结果是返回值。纯函数的例子有strlen()、pow()、sqrt()等。非纯函数的例子有printf()、rand()、time()等。

null

如果一个函数对编译器来说是纯函数,那么 循环优化 子表达式消除 可以应用于它。在GCC中,我们可以使用“pure”属性将函数标记为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);
}


将函数标记为pure表示假设函数“my_strlen()”的调用次数比程序所说的要少。

本文由“Narendra Kangralkar”编辑,Geeksforgeks团队审阅。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享