Выполняет ли компилятор оптимизацию/встроенные неполиморфные вызовы виртуальным методам?
Да, каждый достойный компилятор сделает это.
GCC и MSVC делают это даже на -O0
//Od
режимах.
#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/Od:
; 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>
Какой компилятор? – Inspired
обычно это –
Да, если компилятор может это точно. –