编译器是否优化对虚拟方法的非多态调用

Does the compiler optimize non-polymorphic calls to virtual methods?

本文关键字:多态 调用 方法 虚拟 是否 优化 编译器      更新时间:2023-10-16

编译器是否优化/内联非多态调用虚拟方法?我的意思是,当调用是在一个非多态上下文中,所以一切都知道在编译时?

编译器是否优化/内联非多态调用虚拟方法?

是的,每个像样的编译器都会这样做。

GCC和MSVC甚至在-O0//Od模式下也这样做。

<标题>现场演示h1> g++ 4.8 - 0:
    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/Od:

; Line 34
    call    ??$ASM_MARKER@$0DOI@@@YAXXZ     ; ASM_MARKER<1000>
; Line 35
    lea rcx, QWORD PTR b$[rsp]
    call    ??0Base@@QEAA@XZ
; Line 36
    lea rcx, QWORD PTR b$[rsp]
    call    ?foo@Base@@UEAAXXZ          ; Base::foo
; Line 37
    call    ??$ASM_MARKER@$0HNA@@@YAXXZ     ; ASM_MARKER<2000>
; Line 38
    lea rcx, QWORD PTR d$[rsp]
    call    ??0Derived@@QEAA@XZ
; Line 39
    lea rcx, QWORD PTR d$[rsp]
    call    ?foo@Derived@@UEAAXXZ           ; Derived::foo
; Line 40
    call    ??$ASM_MARKER@$0LLI@@@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    ??$ASM_MARKER@$0PKA@@@YAXXZ     ; ASM_MARKER<4000>