如上所述:
How does the compiler benefit from C++'s new final keyword?
并且如此问题所述,方法的final
关键字可以通过简单的函数指针优化对调用的vtable调用。
如果我上课:
class Derived final : public Base
{
virtual void Foo() override;
//virtual void Foo() final override; Are these statements equal?
}
编译器会将这样的方法标记为final并应用函数指针而不是vtable吗? 我对vc120和clang编译器行为感兴趣,并设置了最高优化级别。
答案 0 :(得分:3)
没有什么能阻止编译器推断Foo
无法进一步覆盖。既然你在问题中指定了Clang,这里是我在Clang 5上用-O1测试的示例代码:
struct Base {
virtual void Foo() = 0;
};
struct Derived final : public Base
{
virtual void Foo() override {}
//virtual void Foo() final override; Are these statements equal?
};
Derived* getD();
int main() {
getD()->Foo();
return 0;
}
它产生了这个( Live on godbolt ):
main: # @main
push rax
call _Z4getDv
mov rdi, rax
call _ZN7Derived3FooEv
xor eax, eax
pop rcx
ret
_ZN7Derived3FooEv: # @_ZN7Derived3FooEv
ret
正如您所看到的,编译器完全能够推断它可以直接调用Derived::Foo
。