假设情况:
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
?
答案 0 :(得分:1)
vtable不一定慢。
例如,在unix共享对象的x86上,使用hack使用当前eip加载ebx,生成了位置无关代码(gcc3,gcc4)。该值用于查找任何静态函数的跳转表。可以通过直接查询this
指针来执行调用动态函数,并且速度更快(如果在给定函数中没有调用静态函数)。
编译器确实知道具体类型,并且能够直接调用该函数,但可以选择虚拟地找到该函数,因为: -
a)可能会更快。
b)它简化了代码生成案例的数量。