.
1、内联函数
- inline内联函数的设计是为了消除函数调用的开销,在编译期间由编译器将函数体插入到每个调用点,来避免常规函数调用时的压栈、跳转和返回等操作,减少函数调用的时间开销。
1.1、内联函数作用
- 减少函数调用开销: 消除函数调用时的函数传递,控制权转移等开销
- 提高程序执行效率:特别适合小型、频繁调用的函数
- 保持代码结构化:即获得了宏替换的性能优势,又保持了函数的机构化特性
2、内联函数的使用
2.1、普通使用
#include <iostream>
// 内联函数声明
inline int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int x = 10, y = 20;
// 调用内联函数 - 编译器可能会直接替换为 return x > y ? x : y;
std::cout << "Max is: " << max(x, y) << std::endl;
return 0;
}
2.2、类成员内联函数
- 类的成员函数是隐式内联函数,在类定义中自动转换内联函数
#include <iostream>
class Circle {
private:
double radius;
public:
// 隐式内联:在类定义中直接实现的成员函数自动为内联
void setRadius(double r) {
radius = r;
}
// 显式内联
inline double getArea() const;
};
// 类外定义的成员函数也可以内联
inline double Circle::getArea() const {
return 3.14159 * radius * radius;
}
int main() {
Circle c;
c.setRadius(5.0);
std::cout << "Area: " << c.getArea() << std::endl;
return 0;
}
2.3、内联函数与模板
#include <iostream>
// 模板函数通常与inline一起在头文件中定义
template <typename T>
inline T square(T x) {
return x * x;
}
int main() {
std::cout << "Square of 5: " << square(5) << std::endl;
std::cout << "Square of 3.14: " << square(3.14) << std::endl;
return 0;
}
2.4、不适合内联的情况
#include <iostream>
// 不适合内联的函数示例:函数体较大且复杂
inline void processData(int* data, int size) {
// 复杂处理逻辑
for (int i = 0; i < size; ++i) {
data[i] = data[i] * 2 + 10;
if (data[i] > 100) {
data[i] = 100;
}
// 更多复杂操作...
}
// 更多代码...
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
processData(arr, 5); // 这种函数不适合内联
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
return 0;
}
思维导图笔记: