On 18.03.2012 5:23, Manu wrote:
The virtual model broken. I've complained about it lots, and people
always say "stfu, use 'final:' at the top of your class".
That sounds tolerable in theory, except there's no 'virtual' keyword to
keep the virtual-ness of those 1-2 virtual functions I have... so it's
no good (unless I rearrange my class, breaking the logical grouping of
stuff in it).
So I try that, and when I do, it complains: "Error: variable
demu.memmap.MemMap.machine final cannot be applied to variable",
allegedly a D1 remnant.
So what do I do? Another workaround? Tag everything as final individually?
My minimum recommendation: D needs an explicit 'virtual' keyword, and to
fix that D1 bug, so putting final: at the top of your class works, and
everything from there works as it should.
Following this thread and observing that you don't trust optimizer and
compiler in many cases or have to double check them anyway, I have a
suggestion: do virtual dispatch by hand via func-pointer table and use
structs.
I'm serious, with a bit of metaprogramming it wouldn't be half bad, and
as a bonus you don't have to pay for a monitor field per object as
classes do, and in general less compiler magic to keep track of. You
also gain the ability to fine tune their layout, the performance maniac
side of yours must see the potential it brings :)
And since you have a few of virtuals anyway and keep them in constant
check it should be double and be much less of a hassle then hunting down
and second-guessing the compiler on every single step.
Bottom line thought: there is a point when a given feature doesn't bring
significant convenience for a specific use case, it's then better to
just stop pushing it over.
--
Dmitry Olshansky