面试题答案
一键面试函数重载
- 实现机制:
- 编译期:函数重载是基于函数签名(函数名、参数列表,不包括返回值类型)在编译期进行决议。编译器根据调用函数时提供的参数的数量、类型和顺序来选择合适的函数版本。例如:
编译器在编译时就能确定具体调用哪个函数,因为参数的类型不同,函数签名不同,从而可以区分不同的重载版本。void func(int a); void func(double a); int main() { func(5); // 调用 void func(int a) func(5.5); // 调用 void func(double a) }
- 对性能优化方向的影响:
- 编译期优化:由于编译期就能确定调用,编译器可以进行内联优化等编译期优化技术。例如,如果一个重载函数代码量较小且频繁调用,编译器可以将函数代码直接嵌入到调用处,减少函数调用的开销(如栈操作等),提高执行效率。
虚函数
- 实现机制:
- 运行期:虚函数基于对象的实际类型在运行期进行决议。C++通过虚函数表(vtable)和虚指针(vptr)来实现虚函数机制。每个包含虚函数的类都有一个虚函数表,类的对象包含一个指向该虚函数表的虚指针。当通过基类指针或引用调用虚函数时,程序在运行时根据对象实际指向的类型(通过虚指针找到对应的虚函数表)来确定调用哪个虚函数的实现。例如:
class Base { public: virtual void func() { std::cout << "Base::func" << std::endl; } }; class Derived : public Base { public: void func() override { std::cout << "Derived::func" << std::endl; } }; int main() { Base* ptr = new Derived(); ptr->func(); // 运行时根据ptr实际指向的Derived对象,调用Derived::func delete ptr; }
- 对性能优化方向的影响:
- 运行期开销:因为是运行期决议,存在额外的开销。每次通过基类指针或引用调用虚函数时,都需要通过虚指针找到虚函数表,再从虚函数表中找到对应的函数地址,这增加了间接寻址的开销。
- 优化方向:在性能敏感的代码中,如果虚函数调用频繁,可以考虑减少虚函数的使用。例如,在某些场景下,如果对象类型在编译期可以确定,可以使用静态多态(如模板)来替代动态多态(虚函数),以减少运行期开销。另外,对于虚函数内部的代码,可以进行优化,减少函数内部的复杂计算等操作,以降低运行期虚函数调用带来的额外开销的影响。