template functions, a special case of constant folding?

Jari-Matti Mäkelä jmjmak at utu.fi.invalid
Fri Mar 24 03:15:31 PST 2006


Hasan Aljudy wrote:
> Derek Parnell wrote:
>> On Thu, 23 Mar 2006 16:34:07 -0700, Hasan Aljudy wrote:
>>
>>
>>> Given the following expression:
>>> #x = 10 * 5 + y;
>>> the compiler will compute 10 * 5 at compile-time and convert the
>>> expression into
>>> #x = 50 + y;
>>>
>>> I think that's called constant-folding, am I right?
>>>
>>> Why can't this be extended such that for the following function:
>>> # int add( int x, int y ) { return x + y; }
>>>
>>> if it's called with constant arguments:
>>> # x = add( 10, 3 );
>>>
>>
>>
>> You can almost do this with mixins, except that mixins only allow one to
>> mixin a complete statement and not just an expression. What would be
>> useful
>> is to allow mixins (or some other similar thing) to generate
>> expressions at
>> compile time and not just statements. Something like ...
>>
>>  
>>  template add(b,c)
>>  {
>>     b + c;
>>  }
>>
>>  int main()
>>  {
>>    int q;
>>    q = mixin add!(10,3);
>>    return q;
>>  }
>>
>> Which would generate
>>  int main()
>>  {
>>    int q;
>>    q = 10 + 3;
>>    return q;
>>  }
>>
>> Which the compiler would constant-fold as normal.
>>
>> But this is starting to look too much like text macros which Walter is
>> very
>> concerned not to have.
>>
> 
> but you're still using templates. which completely defies my point!

Doing this kind of compiler optimization is very expensive (adds
compiling time & optimizer complexity and thus more bugs). If you
already know that the function should be folded / inlined when you're
writing the code, it's a natural way to explicitly say this with
templates. I think the compiler already does some tricks when -inline is
used. I think new M$ compilers convert stuff like this:

 int a = 5, b = 2;
 for (int i=0; i<3; i++) a *= b;
 int get(int c) { return c+2; }
 a = b = get(a);

into:

 int a = 42, b = 42;

but IMHO it's a sign of a bad coder not to optimize code on the higher
levels. It's extremely simple to "hint" to compiler by using templates
and lift the burden of implementation to the metaprogramming engine.

-- 
Jari-Matti



More information about the Digitalmars-d-announce mailing list