MST

星途 面试题库

面试题:C++可变参数模板递归实例的性能优化

请编写一个使用可变参数模板递归展开的函数,用于计算一系列整数的和。之后,阐述如何对这个函数进行性能优化,以避免在递归过程中产生过多的临时对象和不必要的栈开销。
33.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 递归终止模板特化
template<>
int sum() {
    return 0;
}

// 可变参数模板递归展开函数
template<typename T, typename... Args>
int sum(T first, Args... rest) {
    return first + sum(rest...);
}

性能优化

  1. 尾递归优化:现代编译器通常会对尾递归进行优化,将递归转换为迭代。尾递归是指递归调用是函数的最后一个操作。上述 sum 函数就是尾递归形式,编译器可以将其优化为循环,从而避免过多的栈开销。
  2. 使用 constexpr:如果计算在编译期就可以完成,将函数声明为 constexpr,这样在编译时就能得出结果,避免运行时的递归开销。例如:
template<>
constexpr int sum() {
    return 0;
}

template<typename T, typename... Args>
constexpr int sum(T first, Args... rest) {
    return first + sum(rest...);
}
  1. 减少临时对象:由于这里处理的是基本类型 int,不存在构造临时对象的额外开销。但如果处理的是复杂对象,尽量使用 const 引用传递参数,避免不必要的对象拷贝。