如果函数始终为相同的参数值返回相同的结果,并且没有诸如修改参数(或全局变量)或输出某些内容之类的副作用,则该函数称为纯函数。调用纯函数的唯一结果就是返回值。纯函数的示例为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等的更多准备工作,请参阅“完整面试准备课程” 。