【问题标题】:Possibility of Iteration For Compile-Time Computations编译时计算的迭代可能性
【发布时间】:2017-01-11 07:11:30
【问题描述】:

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

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

【问题讨论】:

  • 递归是一种迭代形式。
  • 你也可以使用std::integer_sequence
  • c++14 现在允许对constexpr 函数进行常规迭代。问题是检查函数是constexpr。递归和没有迭代更容易。
  • @rici 我会争辩。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2022-01-21
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多