面试题答案
一键面试性能差异及原理
- 内联函数
- 性能优势:对于短小函数,内联函数通常会有性能提升。在编译时,编译器会将内联函数的代码直接嵌入到调用处,避免了函数调用的开销。函数调用需要保存寄存器、跳转到函数地址、执行函数代码、恢复寄存器等操作,这些操作会带来一定的时间和空间开销。内联函数消除了这些开销,使得代码执行更加高效。
- 原理:编译器在编译阶段,将内联函数体的代码复制到调用该函数的地方,就像宏定义一样展开。但内联函数比宏定义更安全,因为它遵循C++的作用域规则和类型检查。例如,如果内联函数参数是
int
类型,传入其他类型编译器会报错,而宏定义不会进行这样的类型检查。
- 普通函数
- 性能劣势:普通函数每次调用都需要执行函数调用的一系列操作,如栈的操作(压入参数、保存返回地址等),这对于短小函数来说,函数调用的开销在整个函数执行时间中占比较大,从而降低了整体性能。
优先选择内联函数的场景
- 频繁调用的短小函数:例如,在一个循环中多次调用的获取对象某个属性的简单访问器函数。
class Point {
private:
int x;
int y;
public:
// 内联访问器函数
inline int getX() const {
return x;
}
// 内联访问器函数
inline int getY() const {
return y;
}
};
int main() {
Point p;
for (int i = 0; i < 10000; ++i) {
int x = p.getX();
int y = p.getY();
// 对x和y进行一些操作
}
return 0;
}
在这个例子中,getX
和getY
函数非常短小,并且在循环中被频繁调用。使用内联函数可以避免每次调用的开销,提升性能。
2. 函数代码简单且执行时间短:如简单的数学运算函数,像计算两个整数之和的函数。
// 内联函数计算两数之和
inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
return 0;
}
该add
函数代码简单,执行时间短,使用内联函数可以消除函数调用开销,提高效率。