我做了一个简单的sqrt
使用 TMP 进行结构体。它是这样的:
template <int N, int i>
struct sqrt {
static const int val = (i*i <= N && (i + 1)*(i + 1) > N) ? i : sqrt<N, i - 1 >::val;
};
但是会导致错误,因为它没有退出条件,所以我添加了这个:
template <int N>
struct sqrtM<N, 0> {
static const int val = 0;
};
据我了解,如果我们使用 TMP,编译器将进入递归循环,直到满足退出条件(以 sqrt
表示,通常当 i = 0 或 i = 1 时)
但是如果我们进行递归 sqrt
函数,编译器不必深入,直到满足 i = 0
,因为在某个时刻,递归函数在条件 (i*i <= N && (i + 1)*(i + 1) > N)
所在的确切位置结束已满足。
因此,我们假设我们在 sqrt
中投入了非常大的值(value)。 ,那么我们的 TMP 应该对 sqrt<N, sqrt<N-1>::val>
进行额外的计算与 sqrt
的递归版本相比功能,对我来说这似乎是浪费。
我理解错了吗?或者即使在这种情况下 TMP 真的值得吗?
最佳答案
问题是,在 TMP 中,默认情况下你无法深入。深度有限,但可以更改限制(请参阅 this )。另一件事是,您可以使用递归编写 TMP 代码,但它可以编译为非递归代码,因此它不需要保存状态并在深入时执行函数调用的额外成本。所以这是编译时间、可执行文件大小和运行时性能之间的权衡。如果你的 N 在编译时未知,那么你就不能使用 TMP。
关于c++ - 如果递归深度很深,TMP 真的会更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70737474/