编译时递归如何工作?
我在这里找到了一个代码打印1到1000没有循环或条件
有人可以解释编译时间递归是如何工作的,无法在谷歌中找到它
// compile time recursion
template<int N> void f1()
{
f1<N-1>();
cout << N << 'n';
}
template<> void f1<1>()
{
cout << 1 << 'n';
}
int main()
{
f1<1000>();
}
谢谢!
没有找到相关结果
已邀请:
5 个回复
伐教爸
模板,减少
的值(
调用
,依此类推)。
的显式特化结束递归:一旦
变为1,编译器将选择专用函数而不是模板化函数。
使编译器实例化
999次(不计入最终调用
)。这就是为什么编译大量使用模板元编程技术的代码需要一段时间的原因。 整个过程在很大程度上依赖于编译器的优化技能 - 理想情况下,它应该完全取消递归(仅用作模拟使用模板的
循环的hack)。
蜂佬渺
调用
然后打印出1000.
调用
然后打印出999等等。一旦达到1,模板专门化作为中止递归的基本情况。
告耸
坍锭嘉韭蓝
,它们将相互调用。 然后编译器可能会看到这些调用只能变成一系列
语句。也许它会消除调用,也许不会 - 这取决于编译器。从C ++的角度来看,这是一系列函数调用,只要它不改变行为,编译器就可以做任何事情。
俺呵誓放胳