编译器是否优化对虚拟方法的非多态调用
Does the compiler optimize non-polymorphic calls to virtual methods?
编译器是否优化/内联非多态调用虚拟方法?我的意思是,当调用是在一个非多态上下文中,所以一切都知道在编译时?
编译器是否优化/内联非多态调用虚拟方法?
是的,每个像样的编译器都会这样做。
GCC和MSVC甚至在-O0
//Od
模式下也这样做。
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>
标题>
相关文章:
- 对具有不同参数数量的虚函数的多态调用
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- C 中的多态性.在基类上调用继承的方法
- 继承多态性功能调用
- 这种递归多态 C++1y lambda 调用有什么问题?
- C++ 多态错误:没有用于调用的匹配函数
- C++多态性模板类:调用基类方法而不是派生类
- 我调用的函数不是通过多态访问子类的函数
- C++中的多态性:调用重写的方法
- 在多态性中调用3层析构函数
- 无重复代码的多态函数调用
- 使用指针/引用影响本地成员的多态调用
- 如何使用基类指针调用派生类非虚拟成员函数,而无需类型转换和使用多态性
- C++:多态性:调用超级函数
- 多态调用的成本 - C++
- C++ / 多态性 / 虚函数 / 为什么我的子类的函数没有被调用?
- 继承/多态性-调用子类的方法
- 编译器是否优化对虚拟方法的非多态调用