On 03/18/12 15:37, Dmitry Olshansky wrote:
> 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 :)
I was going to suggest the very same thing - but there are (at least) two
problems
with that approach:
1) pass-by-value -- it's dangerous, ugly to work-around (and compiler bugs don't
help, like the one where just having a "this(this)" causes problems); the
workarounds also have compiler/ABI issues (like the 'File' case posted in
D.learn
some time ago, or GDC not passing/returning the pseudo-refs in registers)
2) no inheritance. ie 'struct A{}; struct B{A super; alias super this;}' cannot
be
written as just 'struct B:A {}' - which would not be just syntax sugar, but
also
allow (more) implicit conversions, (explicit) function overrides etc.
So - yes, D structs should be enough for everything, but right now they're still
missing some required basic features. Ideally "class" would just be sugar, and
everything should be expressible using just structs - obviously in a much more
verbose, but 100% compatible way (incl vtables, monitors etc)
After all, real programmers don't use classes. :)
artur