c++ - 如果递归深度很深,TMP 真的会更快吗?

标签 c++ template-meta-programming

我做了一个简单的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/

相关文章:

c++ - 类型、整型常量和模板模板参数的可变参数模板

c++ - 如何在 std::tuple 中合并 std::unordered_map?

c++ - 返回类型不完整的调用方法和我无法解释的模板解决方法

android - mingw32-make `-j` 选项是否损坏?

python - 类交叉引用?

c++ - 如何获取基类的模板类型

c++ - 自动选择按值传递还是按引用传递

c++ - 无法创建 .txt 文件并用 C++ 写入它?

c++ - 如何在 CMake 中设置 --whole-archive 标志,以便所有依赖项都使用它

c++ - 派生类模板化时访问基本成员数据错误