C++虚函数执行效率

Any*_*orn 4 c++ virtual function

我试图更好地了解虚函数的性能,这里是一个示例代码:

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对象执行多少次查找.曾经可以被编译器内联?

谢谢

Uri*_*Uri 7

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

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

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

一般来说,如果您不打算永远覆盖某个函数,请不要将其设置为虚拟.

  • @Uri:带/ LTCG的Visual C++(链接时代码生成)可以看到所有输入文件...... (2认同)

vob*_*ect 5

Elan Ruskin在这个主题上做了一个基准:

http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/

当然,你可以决定他的结果对你来说是如何实践的:-)