根据我的理解,编译时计算是编译器可以计算的任何内容,而不是在程序执行期间计算以提高性能的部分。程序执行时可以进行迭代计算,但在编译时计算期间不允许进行迭代计算。一个麻烦且具体的例子是可变参数模板,人们自然会想到迭代来处理提供的各种类型,但标准和编译器迫使程序员递归地处理它们。
一般来说,所有编译时计算都是通过递归而不是迭代来处理的。据我所知,预期在编译时计算的 constexpr 函数也应该是递归的。是什么使得编译时的任何事情都被禁止迭代?
最佳答案
当我在 Hammer 中实现消除常量子表达式作为优化时,问题证明递归基本上已经在代码生成过程中发生了。您实际上并不需要定义变量,因为它们只是被常量替换。
另一方面,如果您尝试运行循环,则不仅需要具有在运行时对常量执行操作的代码,而且还需要具有成熟的语言解释器。您需要能够声明变量,设置和接收它们的值(作为循环计数器),更糟糕的是,您需要检测无限循环,这样您的编译器就不会挂起(我的意思是, while(true);
是一个完美的常量表达式)。
简而言之,由于解析器、AST 和优化器的性质,在编译时递归地评估各个部分比实现完全控制流以及实现循环和变量操作更容易。
关于c++ - 编译时计算迭代的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41584766/