14.9.5单纯子函数
所谓单纯子函数(PureFunctions)是指那些函数返回值只和调用参数有关。换句话说,就是如果调用函数的参数相同,那么函数的返回结果也相同。如果程序中存在这样的函数,可以在函数定义时使用_pure进行声明,这样在程序编译时编译器会根据函数的调用情况对其进行优化。
下面的例子显示了当函数用_pure声明时,编译器对其所做的优化。
程序源码文件如下。
intsquare(intx)
{
returnx*x;
}
intf(intn)
{
returnsquare(n)+square(n)
}
编译后的结果如下。
square
MOVa2,a1
MULa1,a2,a2
MOVpc,lr
f
STMDBsp!,{lr}
MOVa3,a1
BLsquare
MOVa4,a1
MOVa1,a3
BLsquare
ADDa1,a4,a1
LDMIAsp!,{pc}
上面的程序中,square函数为“单纯子函数”,当使用_pure声明该函数时编译器在调用该函数时,将对程序进行优化。
声明的方法和编译后的结果如下所示。
__pureintsquare(intx)
{
returnx*x;
}
f
STMDBsp!,{lr}
BLsquare
MOVa1,a1,LSL#1
LDMIAsp!,{pc}
从编译后的代码中可以看到,用_pure声明的函数在f函数中只调用了一次。
虽然“单纯子函数”可以提高代码执行效率,但同时也会带来一些负面影响。比如,在“单纯子函数”中,不能直接或间接访问内存地址。所以在程序中使用“单纯子函数”时要特别小心。
另外,还可以使用#pragma声明“单纯子函数”,下面的代码显示了它的声明过程。
#pragmano_side_effects
/*functiondefinition*/
#pragmaside_effects