On 11/29/2014 12:45 PM, David Held wrote:

> On 11/26/2014 4:40 PM, Ali Çehreli wrote:
>> [...]
>>      override
>>      size_t toHash() @trusted pure const nothrow
>>      {
>>          auto func = assumePure(&(typeid(importantStuff).getHash));
>>          return func(&importantStuff);
>>      }
>

> Am I right in assuming that there is some runtime
> cost here, as we are calling through a function pointer?

I think so. However, I think the compiler can eliminate dereferencing the function pointer if it can prove that it is not necessary.

> Is the lack of inlining the only cost, or is getting at the
> typeinfo also costly?

typeid() is a runtime function. I think it will be costly every time toHash is called. The function pointer can be initialized once.

    // I've "deduced" the type from an error message. ;)
static const ulong delegate(const(void*)) const pure nothrow @trusted func;

    // This will be executed once per thread:
    static this() {
        func = assumePure(&(typeid(Foo.init.importantStuff).getHash));
    }

    override
    size_t toHash() @trusted pure const nothrow
    {
        return func(&importantStuff);
    }

Now there is no TypeInfo lookup after thread initialization time.

Ali

Reply via email to