最终类的方法是否默认应用于指向函数优化的指针?

时间:2017-11-23 13:06:22

标签: c++ c++11 vtable

如上所述: 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编译器行为感兴趣,并设置了最高优化级别。

1 个答案:

答案 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