On Thursday, 2 April 2015 at 09:06:52 UTC, Manu wrote:
On 2 April 2015 at 08:15, Martin Nowak via Digitalmars-d
<[email protected]> wrote:
On 04/01/2015 10:31 PM, novice2 wrote:
Can DMD compiler do it itself, as one of optimizations?
You could do it as part of LTO or whole program optimization.
It requires another compiler/linker phase, so it's not easy to
achieve,
maybe the LDC/GDC people have LTO running?
GCC5 comes with a big announcement about devirtualization.
https://www.gnu.org/software/gcc/gcc-5/changes.html#general
It is impossible to do a good job. There are 2 conditions that
break
most opportunities that the compiler may have to improve this:
1) The class is a pointer (duh, in D, all classes are pointers,
so
that condition is implicit).
2) That DLL's exist.
If a DLL may exist, and a class is a pointer (it is), sourced
from an
'impure' location, then it is impossible for the compiler to
generally
do anything at all about final.
It may theoretically be able to do something in the case where
the
class is proofably contained within a 'scope' confined
space/function,
but that particular case is almost mutually exclusive with
cases where
polymorphism is actually useful in the first place, so it's not
really
practical. I also imagine the complexity in the compiler would
be off
the charts.
Basically, if it is _possible_ for a class pointer to come in
contact
with dynamically loaded code, the compiler must conservatively
abandon
any attempt to optimise.
virtual by default is completely wrong for D.
And don't say 'speculative' devirtualisation. What an
abomination!
Just fix the problem; don't have every function be virtual in
the
first place!
+1
Even an escape would be useful so one can do this:
final class Hack {
virtual void func() {}
}
It would then be trivial to stick a final in front of the class.
It would also be required to declare final when instantiating the
class, to work with third-party libraries that don't use final,
i.e.
auto klass = new final Class();
I'm not a language developer and I don't know D that well yet so
I'll stop there before I embarrass myself too much! :D
bye,
lobo