On Friday, 29 January 2016 at 07:17:04 UTC, glathoud wrote:
I have the impression that function implementations are not merged:

    return fun0(fun1(a));

For example, fun1(a) outputs a temporary array, which is then used as input for fun0. Merging the implementations of fun0 and fun1 would eliminate the need for a temporary array.

If fun1(a) indeed eagerly returns a temporary array, you are right. Still, if the author of fun1 cares to be generic enough, it usually returns a lazy range: a struct with front, empty and popFront. Whenever fun0 requests the next element of the range, fun1 calculates it and gives it away (returns front and calls popFront).

Note that all this - which function calls which other function - is known at compile time. To merge the actual code of fun0 and popFront of fun1's return value is then the job for the optimizer pass, it's basically inlining.

Note that a temporary array can theoretically also be optimized out by an advanced optimizer.

Ivan Kazmenko.

Reply via email to