gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:48 26 4
gpt4 key购买 nike

假设这种情况:

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 进行运行时查询以选择正确的 requisites(derived 之一)?或者这种行为是否与不使用虚函数一样有效?换句话说,编译器是否在编译时知道我们正在使用 derived::requisites()

最佳答案

vtable 不一定慢。

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

编译器确实知 Prop 体类型,并且能够直接调用函数,但可能会选择虚拟查找函数,因为:-

a) 它可能会更快。

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

关于C++:直接使用派生类型的模板方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com