On 03/19/12 08:30, Dmitry Olshansky wrote:
> On 19.03.2012 2:17, Artur Skawina wrote:
>> 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)
> 
> GDC not passing pseudo-refs in registers is cleanly a non-issue, in a sense, 
> that it's not a good excuse at all, as well the other bugs.

Something that should work in theory, but does not behave as expected,
*is* an issue, if it means you can't actually use that solution right now.
[Note the GDC problem may or may not still be there; i tried it a while ago;
 the other issues cause enough trouble anyway] 

> All in all, nobody is going to kill you if in performance sensitive code 
> you'd use pointers:
> 
> BigStruct* my_big = allocateSomewhere(...ctor_args...); //ultimately using 
> emplace

struct A{}
struct B{A sup; alias sup this;}
void f1(A* a) {/*...*/}
// Fail:
void f2(B* b) {f1(b);/*...*/}
A* b = new B;

// And, yes, "void f1(ref A a);" etc would work, but then it's just a question
// of time before you'll end up searching the whole project for erroneous struct
// copies, instead of virtuals. And the virtual methods are easier to find...

>> 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.
>>
> 
> Template mixins? I envision:
> struct Foo{
>     mixin Inherit!(Bar);
> }
> 
> I see that it is not a cake-walk but acceptable for the special nature of 
> requirements.

This thread was about larger non-trivial projects, and the difficulty in finding
all methods that do not need to be virtual -- i don't know if replacing the 
whole
class hierarchy with a template-mixin-wrapped-in-structs hierarchy would really 
be
such a good idea. ;)
Also, see the above example - doing struct inheritance by hand, w/o compiler 
help,
quickly gets ugly and dangerous.

>> 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)
> 
> Yes, that the point. And if one doesn't like this kind of compiler sugar, he 
> is free to synthesize Xylitol.

I'm saying "use structs instead of classes" is a good suggestion, but *right 
now*
the language and compiler do not provide enough support to make this practical.
There's a lot of room for (backwards compatible) improvements, though.

artur

Reply via email to