[PATCH] Optimize pointers to member function

John McCall rjmccall at apple.com
Thu Feb 14 14:25:57 PST 2013


On Feb 14, 2013, at 2:15 PM, Olivier Goffart <ogoffart at kde.org> wrote:
> On Thursday 14 February 2013 13:49:23 John McCall wrote:
>> On Feb 14, 2013, at 1:42 PM, Olivier Goffart <ogoffart at kde.org> wrote:
> 
>>> There I read:
>>>  [...] If class B contains the original member, or is a base or derived
>>>  class of the class containing the original member, the resulting pointer
>>>  to  member points to the original member. Otherwise, the result of the
>>>  cast is undefined.
>>> 
>>>> int main() { void (A::*t)() = (void(A::*)())&B::n; }
>>> 
>>> So that cast is undefined.
>> 
>> The original member is B::n, and A is a base class of the class containing
>> the original member.
> 
> Ah right.
> Turns out I was wrong :-)
> Sorry for the noise.

Well, we could still pursue optimizations like this in the presence of final
classes.  Most people don't aggressively make their classes final, but if
you tell them that there's an optimization if they do...  Of course, it's up to
you whether you still care enough to pursue this in that case.

In fact, if the class of the base expression is final, we can skip not just
the this-adjustment, but also potentially the entire virtual or non-virtual case
depending on the type of the member we're calling.

John.



More information about the cfe-commits mailing list