2013-06-09 1 views

답변

0

컴파일러는 가상 메소드에 대한 비 다형성 호출을 최적화/인라인합니까?

예, 모든 적절한 컴파일러가이 작업을 수행합니다.

GCC와 MSVC는 -O0//Od 모드에서도 수행합니다.

LIVE DEMO

#ifdef _MSC_VER 
    #define NOINLINE __declspec(noinline) 
#else 
    #define NOINLINE __attribute__ ((noinline)) 
#endif 

template<int> 
NOINLINE void ASM_MARKER() 
{ 
    static volatile int anti_opti = 11; 
    (void)anti_opti; 
} 

void base(); 
void derived(); 

struct Base 
{ 
    virtual void foo() 
    { 
     base(); 
    } 
}; 
struct Derived: Base 
{ 
    void foo() override 
    { 
     derived(); 
    } 
}; 

int main() 
{ 
    ASM_MARKER<1000>(); 
    Base b; 
    b.foo(); 
    ASM_MARKER<2000>(); 
    Derived d; 
    d.foo(); 
    ASM_MARKER<3000>(); 
    Base &r = d; 
    r.foo(); 
    ASM_MARKER<4000>(); 
} 

G ++ 4.8 -O0 :

call void ASM_MARKER<1000>() 
    movq vtable for Base+16, -32(%rbp) 
    leaq -32(%rbp), %rax 
    movq %rax, %rdi 
    call Base::foo() 
    call void ASM_MARKER<2000>() 
    movq vtable for Derived+16, -16(%rbp) 
    leaq -16(%rbp), %rax 
    movq %rax, %rdi 
    call Derived::foo() 
    call void ASM_MARKER<3000>() 
    leaq -16(%rbp), %rax 
    movq %rax, -8(%rbp) 
    movq -8(%rbp), %rax 
    movq (%rax), %rax 
    movq (%rax), %rax 
    movq -8(%rbp), %rdx 
    movq %rdx, %rdi 
    call *%rax  // <--------------- NOT OPTIMIZED 
    call void ASM_MARKER<4000>() 

MSVC2010SP1/외경 :

; Line 34 
    call [email protected][email protected]@@YAXXZ  ; ASM_MARKER<1000> 
; Line 35 
    lea rcx, QWORD PTR b$[rsp] 
    call [email protected]@[email protected] 
; Line 36 
    lea rcx, QWORD PTR b$[rsp] 
    call [email protected]@@UEAAXXZ   ; Base::foo 
; Line 37 
    call [email protected][email protected]@@YAXXZ  ; ASM_MARKER<2000> 
; Line 38 
    lea rcx, QWORD PTR d$[rsp] 
    call [email protected]@[email protected] 
; Line 39 
    lea rcx, QWORD PTR d$[rsp] 
    call [email protected]@@UEAAXXZ   ; Derived::foo 
; Line 40 
    call [email protected][email protected]@@YAXXZ  ; ASM_MARKER<3000> 
; Line 41 
    lea rax, QWORD PTR d$[rsp] 
    mov QWORD PTR r$[rsp], rax 
; Line 42 
    mov rax, QWORD PTR r$[rsp] 
    mov rax, QWORD PTR [rax] 
    mov rcx, QWORD PTR r$[rsp] 
    call QWORD PTR [rax]  // <--------------- NOT OPTIMIZED 
; Line 43 
    call [email protected][email protected]@@YAXXZ  ; ASM_MARKER<4000> 
관련 문제