内联函数

内容简介

inline 最初用于建议编译器把函数体展开到调用处,以减少函数调用开销。现代 C++ 中,inline 更重要的作用是允许函数或变量在多个翻译单元中定义而不违反 ODR,常用于头文件中的小函数。

用法

普通内联函数

inline int max_value(int a, int b)
{
    return a > b ? a : b;
}

类内定义的成员函数

class Counter {
public:
    int value() const
    {
        return value_;
    }
 
private:
    int value_ = 0;
};

类内定义的成员函数隐式具有内联性质。

头文件中的函数

// math_utils.h
#pragma once
 
inline int square(int value)
{
    return value * value;
}

最佳代码实践

  • 短小、频繁调用、适合放头文件的函数可以写 inline
  • 不要为了“性能感”把大函数都写成 inline
  • 函数是否真正展开由编译器决定,inline 只是允许和建议。
  • 头文件中定义非模板普通函数时,通常需要 inline,否则多个 .cpp 包含后可能重复定义。

错误用法

// header.h
int add(int a, int b)
{
    return a + b;
}

如果这个头文件被多个 .cpp 包含,链接时可能重复定义。应改为:

inline int add(int a, int b)
{
    return a + b;
}

注意事项

  • “内联函数不能包含循环或 switch”是过时说法,现代 C++ 语法允许,编译器会自行决定是否展开。
  • 模板函数通常定义在头文件中,不一定需要显式写 inline
  • 过度内联可能增大代码体积,反而影响指令缓存。

相关:cpp函数进阶cpp模板编程知识地图

学习路径