为什么C++里调用虚函数比调用普通函数慢?
原因:
- 运行时需要得到对应类的函数的地址
- 当在用父类的引用或者指针调用虚函数时,会先从该对象的头部取到虚函数的地址(C++标准规定虚函数表地址必须放最前),再从虚函数表中取到实际要调用的函数的地址,最终调用该函数
- 调用虚函数,相比普通函数,实际上多了三条指令:取虚表,取函数地址,call调用。
- 影响cpu流水线
- 编译器不能是内联函数
- 仅当用父类引用或者指针调用时,不能内联
- 因为内联函数是指在编译期间用被调用的函数体本身来代替函数调用的指令,但是虚函数是直到运行时才能知道要调用的是哪一个函数,所以没法在编译时进行内联函数展开。
- 但是当子类直接调用虚函数,是可以内联优化的。
- 单继承时性能差不多,多继承的时候会慢