Array toHash()

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Nov 29 15:59:15 PST 2014


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



More information about the Digitalmars-d-learn mailing list