D 50% slower than C++. What I'm doing wrong?

Steven Schveighoffer schveiguy at yahoo.com
Mon Apr 16 05:26:43 PDT 2012


On Sat, 14 Apr 2012 22:31:40 -0400, Jonathan M Davis <jmdavisProg at gmx.com>  
wrote:

> On Sunday, April 15, 2012 04:21:09 Joseph Rushton Wakeling wrote:
>> On 14/04/12 23:03, q66 wrote:
>> > He also uses a class. And -noboundscheck should be automatically  
>> induced
>> > by
>> > -release.
>>
>> ... but the methods are marked as final -- shouldn't that substantially
>> reduce any speed hit from using class instead of struct?
>
> In theory. If they don't override anything, then that signals to the  
> compiler
> that they don't need to be virtual, in which case, they _shouldn't_ be
> virtual, but that's up to the compiler to optimize, and I don't know how  
> good
> it is about that right now.

You are misunderstanding something.  Final functions can be in the vtable,  
and still not be called via the vtable.

i.e.:

class C
{
    int foo() { return 1; }
}

class D : C
{
    override final int foo() { return 2; }
}

void main()
{
    auto d = new D;
    C c = d;

    assert(d.foo() == 2); // non-virtual, inline-able call.
    assert(c.foo() == 2); // virtual call
}

Disclaimer -- I haven't examined any of the code being discussed or the  
issues contained in this thread.  I just wanted to point out this  
misunderstanding.

-Steve


More information about the Digitalmars-d-learn mailing list