MST

星途 面试题库

面试题:C++ 非虚函数性能优势在继承体系中的体现

在一个简单的C++继承体系中,基类有一个非虚函数 `void baseFunction()` 和一个虚函数 `virtual void virtualFunction()`,派生类重写 `virtualFunction()`。请解释为什么调用 `baseFunction()` 可能比调用 `virtualFunction()` 具有更好的性能,从函数调用机制角度分析。
19.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 非虚函数 baseFunction() 的调用机制
    • 非虚函数的调用是在编译期确定的。编译器在编译时,根据对象的静态类型(即声明对象时所使用的类型),直接生成调用该函数的机器码。
    • 例如,若有代码 Base b; b.baseFunction();,编译器知道 bBase 类型,直接生成调用 Base::baseFunction 的指令。这是一种静态绑定机制,不需要额外的运行时开销来确定具体调用哪个函数版本。
  2. 虚函数 virtualFunction() 的调用机制
    • 虚函数的调用是在运行期确定的,采用动态绑定机制。当对象调用虚函数时,编译器会生成代码去查找虚函数表(vtable)。
    • 每个包含虚函数的类都有一个虚函数表,对象内部包含一个指向虚函数表的指针(vptr)。在运行时,程序通过对象的 vptr 找到对应的虚函数表,然后根据虚函数在表中的索引找到要调用的具体函数版本。
    • 例如,若有代码 Base *ptr = new Derived(); ptr->virtualFunction();,在运行时,程序要通过 ptr 指向对象的 vptr 找到虚函数表,再确定调用 Derived::virtualFunction,这涉及到额外的间接寻址操作,增加了运行时开销。
  3. 性能差异
    • 由于非虚函数 baseFunction() 的调用在编译期就确定,不需要运行时查找虚函数表等额外开销,所以调用 baseFunction() 可能比调用 virtualFunction() 具有更好的性能。