Proposal: Operator overloading without temporaries
    xs0 
    xs0 at xs0.com
       
    Tue Mar 28 08:24:58 PST 2006
    
    
  
James Dunne wrote:
> If possible, can someone lay out a clear definition of both "array 
> expressions" and "expression templates"?  I'd really like to fully 
> understand what's possible in this area for my own research.
> 
> Thanks,
> 
afaik, array expressions are just expressions which get evaluated 
element-wise over whole arrays:
a[] = b[] + c[]; // must be same length
is the same as
for (int i=0; i<a.length; i++)
     a[i] = b[i] + c[i];
The advantage of having them instead of doing for loops (in addition to 
aesthetics) is that the compiler can optimize the code much better (for 
example, by doing vectorization == AltiVec/MMX/SSE), because it clearly 
knows what you're doing - with a for loop, it's just a bunch of 
single-element operations.
Expression templates, otoh, are a somewhat complex template technique, 
which allows efficient evaluation of expressions over arbitrary types. 
Instead of evaluating the expression one operation at a time:
a = b + c * d
usually becomes
_t1 = c.opMul(d);
_t2 = b.opAdd(_t1);
a = _t2
the expressions first evaluate to template instances, which can then be 
inlined and optimized by the compiler. That obviously results in faster 
execution. The above example would become something like:
auto expr=Sum!(b, Product!(c, d));
a.length=expr.length;
for (int i=0; i<a.length; i++)
     a[i]=expr.evaluate(i); // hopefully inlines to b[i]+c[i]*d[i]
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html
One problem in doing them in D is that you can't overload the = 
operator, so the best one can hope for is
(b+c*d).assignTo(a);
// or
a = (b+c*d).eval();
Another problem is that expression templates rely heavily on implicit 
instantiation, which is currently quite basic in D (but getting better).
Hope that helped :)
xs0
    
    
More information about the Digitalmars-d
mailing list