gpt4 book ai didi

C++虚函数执行效率

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:56 25 4
gpt4 key购买 nike

我正在尝试更好地了解虚函数的性能这是一个示例代码:

struct Foo {    virtual void function1();    virtual void function2() { function1(); }};struct Bar : Foo {    virtual void function1();}Bar b;Foo &f = b;b.function2();b.function1();f.function2();

对于代码示例最后三行中的三个调用中的每一个,它们是否都必须在虚拟表中查找函数指针?必须为 f 对象执行多少次查找。哪一次可以被编译器内联?

谢谢

最佳答案

对 b 的调用是静态的——编译器在编译时肯定知道 b 在运行时的类型(显然是 Bar),因此它将直接使用将被调用的方法的地址。

Virtual 仅在您通过指针/引用进行调用时才重要,因为调用在运行时可能有不同的目标。例如,如果您在指针上调用 function1 并且在运行时更改了指针指向的实际类型,这将很重要。

现在,您在 f 上调用 function2 的情况很棘手,原因有两个:该函数永远不会被覆盖,并且您使用了无法重新分配的引用。因此,一个真正聪明的编译器可以看到所有输入文件,可以 100% 地确定调用的目标是什么(因为您不会向已编译的代码添加新类)。但是,AFAIK,编译器不必这样做,因此您需要支付费用。

一般来说,如果您不打算重写某个函数,就不要将其设为虚函数。

关于C++虚函数执行效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032325/

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