Why is "array operation without destination memory not allowed"?

Ali Çehreli acehreli at yahoo.com
Sat Jan 6 23:17:53 UTC 2018


On 01/06/2018 03:08 PM, Lily wrote:
> It seems a bit silly that I have to write
> 
> int[] a = [1, 2, 300, -29];
> int[] b;
> b.length = 4;
> b[] = a[] * 2;
> writeln(b);
> 
> to do what I would expect
> 
> int[] a = [1, 2, 300, -29];
> writeln(a[] * 2);
> 
> to do. What am I not understanding?

So, apparently a[] * 2 is not an expression in D. It looks like such 
array-wise operations require a left-hand side with memory for the results.

The reason must be for performance. If a[]*2 were an expression, the 
runtime would have to allocate memory and put the results there. 
Assigning that memory then to b[] would require an additional copy. 
Current rule puts the burden on the programmer to find the memory. No 
need to allocate if there's memory already.

However, idiomatic D delays arrays as much as possible. For example, 
there is no need for destination memory for this example:

import std.stdio;
import std.algorithm;

void main() {
     int[] a = [1, 2, 300, -29];
     writeln(a.map!(x => 2 * x));
}

Ali


More information about the Digitalmars-d-learn mailing list