这部分内容来自《Primer C++》第五版中文版213页。
内联函数
在函数返回类型前添加inline关键字,可以将该函数命名为内联函数。内联函数可以将每个调用该函数的调用点直接展开,无需真正的调用这个函数。提升了性能。
例如:
inline const string& shorterString(const string& s1, const string& s2)
{
return s1.size() > s2.size() ? s1 : s2;
}
int main()
{
cout << shorterString("hello", "world!") << endl;
// 上面会被展开成cout << s1.size() > s2.size() ? s1 : s2 << endl; , 避免了函数调用
}内联函数一般用于优化规模小,流程直接,频繁调用的函数。很多编译器不支持内联递归函数。
inline可以实现函数模板,如下:
template<typename T> inline const T& shorterString(const T& s1, const T& s2)
{
return s1.size() > s2.size() ? s1 : s2;
}
int main()
{
auto nums1 = vector<int>(4, 5);
auto nums2 = vector<int>(3, 6);
for (auto& i : shorterString(nums1, nums2))
{
cout << i << endl;
}
}注意模板的参数列表在inline前边。
定义在类内部的函数都是隐式的inline函数。在类外部定义的函数可以用Inline定义,最好放在一个头文件中。
constexpr函数
constexpr函数值能用于常量表达式的函数。函数定义与普通函数定义类似,需要遵守以下规定:
返回类型和形参类型必须是字面值类型。
函数体中只能有一条return语句。
例子:
constexpr int scale(int i)
{
return i * 2;
}
int main()
{
int nums[scale(5)]; // 正确,constexpr函数返回了常量表达式
int i = 3;
int nums2[scale(i)]; // 错误,返回的不是常量表达式
}
评论区