Test for array literal arguments?
Peter Alexander
peter.alexander.au at gmail.com
Tue Jun 5 18:20:00 PDT 2012
On Tuesday, 5 June 2012 at 23:48:48 UTC, bearophile wrote:
> So we are back to an idea Walter has tried and refused few
> years ago, of compile-time known arguments with "static". The
> small difference here is (I think) that both iPow templates are
> allowed to exist in the code at the same time, and the iPow
> overload with "static" is preferred by the argument is known at
> compile-time:
I was also thinking about this idea today. I was writing a small
math function (Van der Corput sequence generator) with the
signature vdc(int n, int b) and noticed that the code could be
faster when b == 2 (the most common case) because divides can be
turned into shifts and mods turned to bitwise AND etc.
You could duplicate the function to take the static args as
template args, but that's ugly.
I also came to the conclusion of using 'static' as a parameter
"storage class" to specify that the parameter is known at
compile-time.
One problem with this approach is that it only solves some cases
and cannot work in general. It also has other implications:
- Code with 1 or more optimised versions will require extra
maintenance/testing.
- Makes code more difficult to reason about (can be difficult to
tell which is version is called).
- Adds more rules for overload resolution.
However, the biggest problem with this proposal (in my opinion)
is that it is unnecessary. I care deeply about performance, but
tiny optimisations like this are simply not important 99% of the
time. When they are important, just write a specific optimised
version and use that. Yes, you lose generality, but special needs
call for special cases. Let's not complicate the language and
bloat the codebase further for questionable gain.
More information about the Digitalmars-d
mailing list