函数被调用 纯函数 如果它总是为相同的参数值返回相同的结果,并且没有任何副作用,比如修改参数(或全局变量)或输出某些东西。调用纯函数的唯一结果是返回值。纯函数的例子有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