主要内容

避免数据拷贝函数输入生成的代码

你可以减少副本生成的代码通过编写函数,使用相同的变量作为一个输入和一个输出。例如:

函数一个= foo (A, B)% # codegen一个= A * B;结束

这个编码实践使用引用参数优化。当一个变量作为输入和输出,生成的代码传递变量通过引用而不是多余地将输入复制到一个临时变量。在前面的例子中,输入一个在生成的代码是通过引用,因为它也充当一个输出函数喷火:

…/ *函数定义* /空白foo(双*,双B) {* * = B;}……

参考参数优化减少内存使用和执行时间,尤其是当变量通过引用传递是一个大型的数据结构。在调用站点上实现这些好处,调用这个函数相同的变量作为输入和输出。

相反,假设您重写函数喷火没有优化:

函数y = foo2 (A, B)% # codegeny = A * B;结束

生成的代码将输入值并返回输出的值:

…/ *函数定义* /双foo2(双,双B){返回* B;}……

在某些情况下,函数的输出不能修改版本的输入。如果不使用输入后面的函数,您可以修改您的代码操作的输入,而输入的副本。一个方法是创建额外的函数的返回值。例如,考虑代码:

函数日元= foo (u1)% # codegenx1 = u1 + 1;日元=酒吧(x1);结束函数y2 =栏(u2)%因为foo不使用x1在之后的函数,%是最佳做此操作x2 = u2。* 2;%的变化维度下面的代码%,这意味着它不能被完成y2 = (x2, x2);结束

您可以修改代码以消除冗余副本。

函数日元= foo (u1)% # codegenu1 = u1 + 1;[u1]日元=酒吧(u1);结束函数(y2, u2) = (u2) u2 = u2。* 2;%的变化维度下面的代码%仍然意味着它不能被完成y2 = (u2, u2);结束

参考参数优化并不适用于恒定的输入。如果相同的变量是一个输入和一个输出和输入是常数,代码生成器将输出作为一个独立的变量。例如,考虑函数喷火:

函数一个= foo (A, B)% # codegen一个= A * B;结束

生成代码的一个有一个恒定值2

codegen配置:自由喷火arg游戏3}{coder.Constant (2)报告

生成的代码定义常数一个并返回的值输出。

…#定义(2.0)…双foo(双B){返回* B;}……