面试题答案
一键面试编译器处理区别
- 类内部定义:在类内部定义的成员函数,编译器默认将其视为内联函数。不过这只是一种建议,最终是否真的内联,由编译器根据具体情况决定。例如函数代码量较小、调用频繁等情况可能会被实际内联。
- 类外部定义:在类外部定义的成员函数,默认不是内联函数。如果希望其为内联函数,需要显式使用
inline
关键字声明。
内联特性区别
- 类内部定义:由于默认被视为内联函数,若满足内联条件,在调用处,编译器会尝试将函数代码直接嵌入,减少函数调用开销(如栈的开辟与销毁、参数传递等),从而提高效率。
- 类外部定义:未加
inline
声明时,按普通函数处理,调用时执行函数跳转。加上inline
声明后,若满足内联条件,编译器同样可能将函数代码嵌入调用处。
代码优化示例
#include <iostream>
class Example {
public:
// 类内部定义成员函数,默认被视为内联
int add(int a, int b) {
return a + b;
}
};
class AnotherExample {
public:
int multiply(int a, int b);
};
// 类外部定义成员函数,默认不是内联
inline int AnotherExample::multiply(int a, int b) {
return a * b;
}
int main() {
Example ex;
AnotherExample anEx;
int result1 = ex.add(3, 5);
int result2 = anEx.multiply(4, 6);
std::cout << "Add result: " << result1 << std::endl;
std::cout << "Multiply result: " << result2 << std::endl;
return 0;
}
在上述代码中,Example
类的 add
函数在类内部定义,AnotherExample
类的 multiply
函数在类外部定义并显式声明为 inline
。如果编译器认为它们满足内联条件,在 main
函数调用处,这两个函数的代码可能会被直接嵌入,减少函数调用开销,提升性能。对于频繁调用且代码简单的函数,使用这种内联方式可以显著优化性能。