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对象执行多少次查找.曾经可以被编译器内联?
谢谢
对b的调用是静态的 - 编译器在编译时肯定知道b在运行时的类型(显然是Bar),因此它将直接使用将被调用的方法的地址.
虚拟仅在通过指针/引用进行调用时很重要,因为调用在运行时可能具有不同的目标.例如,如果您在指针上调用function1并且在运行时更改了指针指向的实际类型,则这很重要.
现在这里你在f上调用function2的情况很棘手有两个原因:函数永远不会被覆盖,并且你使用了一个无法重新赋值的引用.因此,一个真正智能的编译器可以看到所有输入文件,可以100%放心地确定调用的目标是什么(因为你不打算在已编译的代码中添加新类).但是,AFAIK,编译器不必这样做,因此您需要支付费用.
一般来说,如果您不打算永远覆盖某个函数,请不要将其设置为虚拟.
Elan Ruskin在这个主题上做了一个基准:
http://assemblyrequired.crashworks.org/2009/01/19/how-slow-are-virtual-functions-really/
当然,你可以决定他的结果对你来说是如何实践的:-)
| 归档时间: |
|
| 查看次数: |
1266 次 |
| 最近记录: |