C ++:直接使用派生类型的模板方法模式

时间:2016-02-03 18:30:39

标签: c++ derived-class virtual-functions vtable

假设情况:

struct base
{
    void method()
    {
        requisites();

        do_it();
    }

    virtual void requisites() const = 0;
    void do_it() { /* do it */ }
};

struct derived : base
{
    void requisites() const
    {
        if (!my_requisites)
           throw something;
    }
}

int main()
{
    derived d;
    d.method();

    return 0;
}

在这种情况下,我没有使用指针或引用,而是直接使用派生类型的实例,编译器是否需要针对vtable执行运行时查询以选择正确的覆盖{{1 (requisites)之一?或者这种行为与不使用虚函数一样有效?换句话说,编译器是否在编译时知道我们正在使用derived

1 个答案:

答案 0 :(得分:1)

vtable不一定慢。

例如,在unix共享对象的x86上,使用hack使用当前eip加载ebx,生成了位置无关代码(gcc3,gcc4)。该值用于查找任何静态函数的跳转表。可以通过直接查询this指针来执行调用动态函数,并且速度更快(如果在给定函数中没有调用静态函数)。

编译器确实知道具体类型,并且能够直接调用该函数,但可以选择虚拟地找到该函数,因为: -

a)可能会更快。

b)它简化了代码生成案例的数量。