#include <iostream>
// 递归终止模板特化
template<>
int sum() {
return 0;
}
// 可变参数模板递归展开函数
template<typename T, typename... Args>
int sum(T first, Args... rest) {
return first + sum(rest...);
}
性能优化
- 尾递归优化:现代编译器通常会对尾递归进行优化,将递归转换为迭代。尾递归是指递归调用是函数的最后一个操作。上述
sum
函数就是尾递归形式,编译器可以将其优化为循环,从而避免过多的栈开销。
- 使用
constexpr
:如果计算在编译期就可以完成,将函数声明为 constexpr
,这样在编译时就能得出结果,避免运行时的递归开销。例如:
template<>
constexpr int sum() {
return 0;
}
template<typename T, typename... Args>
constexpr int sum(T first, Args... rest) {
return first + sum(rest...);
}
- 减少临时对象:由于这里处理的是基本类型
int
,不存在构造临时对象的额外开销。但如果处理的是复杂对象,尽量使用 const
引用传递参数,避免不必要的对象拷贝。