Hi,

By simple MFPs I mean those that point to a class with single or no inheritance
and the class is fully defined at the time of the call. For example:

class SomeClass {};

typedef void (SomeClass::*MemberFunc)();

void callMemberFunc(SomeClass *object, MemberFunc func)
{
   (object->*func)();
} 

g++ seems to generate the same code whether SomeClass is a complete type or
not. In the above example, VS 2005 can significantly optimise the call when
SomeClass is defined:

00424D40  mov         ecx,dword ptr [esp+4]
00424D44  jmp         dword ptr [esp+8] 

g++ 4.2.1 generates the following:

        .file   "test.cpp"
        .text
        .align 2
        .p2align 4,,15
.globl __Z12callDelegateRN12fastdelegate12FastDelegateIFvvEEE
        .def    __Z12callDelegateRN12fastdelegate12FastDelegateIFvvEEE; .scl   
2;      .type   32;     .endef
__Z12callDelegateRN12fastdelegate12FastDelegateIFvvEEE:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ebx
        movl    8(%ebp), %eax
        movl    4(%eax), %ecx
        movl    (%eax), %ebx
        movl    8(%eax), %edx
        testb   $1, %cl
        je      L7
        leal    (%ebx,%edx), %edx
        movl    (%edx), %eax
        movl    -1(%eax,%ecx), %ecx
        movl    %edx, 8(%ebp)
        popl    %ebx
        popl    %ebp
        jmp     *%ecx
        .p2align 4,,7
L7:
        leal    (%ebx,%edx), %edx
        movl    %edx, 8(%ebp)
        popl    %ebx
        popl    %ebp
        jmp     *%ecx

I've reproduced this on 4.2.1 and 3.4.2 on x86 (MinGW) and 4.1.1, 4.1.0, 4.0.1
and 3.4.4 on arm/thumb.

Would it be possible for gcc to optimise such calls?


-- 
           Summary: Slow calls through simple member function pointers
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dleska at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33358

Reply via email to