文档

消除函数输入的冗余副本

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

函数A = foo(A, B)% # codegenA = A * b;结束

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

…/*函数定义*/ void foo(double *A, double B) {*A *= B;}……

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

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

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

生成的代码按值传递输入,并返回输出的值:

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

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

函数[u1]日元= foo (u1)% # codegenx1 = u1 + 1;日元=酒吧(x1);结束函数y2 =栏(u2)这一行阻止编译器优化看在榜样的份上coder.inline (“永远”);因为foo在后面的函数中没有使用u2,在适当的地方做这个手术是最好的。x2 = u2。* 2;%以下代码中尺寸的变化%意味着它不能在适当的地方完成y2 = (x2, x2);结束

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

函数[u1]日元= foo (u1)% # codegenu1 = u1 + 1;[u1]日元=酒吧(u1);结束函数(y2, u2) =栏(u2)这一行阻止编译器优化看在榜样的份上coder.inline (“永远”);u2 = u2。* 2;%以下代码中尺寸的变化%仍然意味着不能就地完成y2 = (u2, u2);结束

参考参数优化不适用于常量输入。如果相同的变量是输入和输出,并且输入是常量,代码生成器将输出视为单独的变量。例如,考虑函数喷火

函数A = foo(A, B)% # codegenA = A * b;结束

生成以下代码一个有一个常数值2

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

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

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

相关的话题

这个话题有用吗?