内联函数
内容简介
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。 - 过度内联可能增大代码体积,反而影响指令缓存。