编译时计算的迭代可能性

时间:2017-01-11 07:11:30

标签: c++ compiler-construction variadic-templates constexpr compile-time

在我的理解中,编译时计算是编译器可以计算的任何内容,而不是在程序执行期间计算的部分,以提高性能。程序执行时可以进行迭代计算,但在编译时计算期间不允许进行迭代计算。一个麻烦而具体的例子是Variadic模板,其中一个人自然地想到迭代来处理提供的各种类型,但标准和编译器迫使程序员递归地处理它们。

通常,所有编译时计算都是通过递归而不是迭代来处理的。据我所知,预期在编译时计算的constexpr函数也应该是递归的。什么使得迭代禁止编译时的任何东西?

1 个答案:

答案 0 :(得分:2)

当我在Hammer中实现消除常量子表达式作为优化时,问题结果是在代码生成期间基本上已经发生了递归。你真的不需要定义变量,因为它们只是被常量替换。

另一方面,如果您正在尝试运行循环,那么您不仅需要拥有不仅仅在运行时对常量执行操作的代码,而且还是一个完整的语言解释器。你需要能够声明变量,设置和接收它们的值(作为循环计数器),更糟糕的是,你需要检测无限循环,这样你的编译器就不会挂起(我的意思是,while(true);是一个完全不变的表达)。

简而言之,由于解析器,AST和优化器的性质,在编译时递归评估部件比实现完全控制流并实现循环和变量操作更容易。