Operator overloading and loop fusion

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Nov 4 06:47:28 PST 2009


I wanted to discuss operator overloading a little bit. A good starting 
point is Don's proposal

http://www.prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP7

which discusses the issues involved and makes one major proposal - that 
of equivalence of operators that gives the compiler freedom to eliminate 
temporaries.

Another trend is moving from many named operators to few templated 
operators that simply pass the name of the operator as a compile-time 
string. (If there's a need for virtual functions, it's trivial to have 
the template dispatch to several virtual functions.)

There's a third, more recent idea. When we were discussing about 
array-wise operations, Walter mentioned that he sees no reason why

a[] = b[] + x * c[] * d[];

should not work on other types than built-in arrays. I think that's a 
great idea.

For built-in arrays, that does today

assert(a.length == b.length);
assert(a.length == c.length);
assert(a.length == d.length);
foreach (__i; a.length) a[__i] = b[__i] + x * c[__i] * d[__i];

The general technique is called loop fusion or at least is related to 
it. Instead of writing several loops that compute parts of the 
expression, the statement only defines a loop that does all operations.

So, Walter's idea is to extend such expressions to general ranges. If 
the right-hand side of an expression involves ranges and scalars, and if 
the left-hand side is a range, then the compiler simply writes the loop 
around the lockstep iteration.

I'm unclear how detection would work, e.g. what if a range wants to 
define "+" itself to do something else than fusion? Should operator 
overloading be banned for ranges? That would be too restrictive because 
sometimes you actually don't want fusion.

If we define this well, we can say that the operator overloading is 
quite complete, without growing the language. Between fusion, ETs, and 
temporary elimination, I think we got most everything covered.


Andrei



More information about the Digitalmars-d mailing list