面试题答案
一键面试内联定义(定义在类内)
- 优点
- 潜在性能提升:编译器可能会将内联函数的代码在调用处展开,避免了函数调用的开销(如栈的开辟与恢复、参数传递等),在频繁调用的小函数场景下,可提升程序性能。例如,一个简单的获取成员变量值的
getter
函数,定义在类内作为内联函数,每次调用时直接展开代码,减少了函数调用的额外开销。 - 代码紧凑:函数定义和类定义在同一处,代码结构更紧凑,便于理解和维护。比如一个小型的辅助类,其成员函数都定义在类内,整个类的功能一目了然。
- 潜在性能提升:编译器可能会将内联函数的代码在调用处展开,避免了函数调用的开销(如栈的开辟与恢复、参数传递等),在频繁调用的小函数场景下,可提升程序性能。例如,一个简单的获取成员变量值的
- 缺点
- 增加代码体积:如果函数体较大,内联展开会使目标代码体积增大,可能导致缓存命中率降低,反而影响性能。例如一个复杂的业务逻辑函数定义为内联,展开后占用大量空间,使得缓存中可容纳的代码量减少。
- 编译时间增加:编译器需要对每个调用处展开内联函数代码,增加了编译时间。尤其是在大型项目中,内联函数过多会显著延长编译时间。
定义在类外
- 优点
- 代码分离:实现了接口和实现的分离,使类的声明更简洁,专注于类的功能描述,而实现部分可以在其他地方详细编写。例如在一个大型类中,将复杂的成员函数实现放在类外,类的头文件中只保留函数声明,提高了代码的可读性和可维护性。
- 减少编译时间:相比内联函数,不会因代码展开而增加编译时间。特别是对于大型项目,减少编译时间对开发效率有较大提升。
- 缺点
- 函数调用开销:每次调用函数时会产生栈操作等函数调用开销,在频繁调用场景下,相比内联函数会降低性能。例如一个简单的计数器自增函数,若定义在类外,每次调用都需要进行函数调用操作,不如内联函数直接展开高效。