C ++中的编译时函数是什么?

问题描述 投票:1回答:2

我已经在此处(在SO上)搜索了这个问题,据我所知,所有问题都假设什么是编译时间函数,但是对于初学者来说,几乎不可能知道这意味着什么,因为知道这一点的资源非常多罕见。

我发现了简短的wikipedia article,它显示了如何通过在C ++中编写枚举从未使用过的枚举来编写难以理解的代码,以及一个关于它的未来的video,但是对此的解释很少。

在我看来,有两种方法可以用C ++编写编译时函数

  1. constexpr
  2. template<>

我已经简要介绍了它们两个,但是我不知道它们如何在这里弹出。

任何人都可以用足够好的示例来解释编译时函数,使其包含其大多数相关功能吗?

c++ templates constexpr compile-time
2个回答
0
投票

您所看到的“编译时函数”不是C ++构造,它只是在编译时计算内容(因此,函数)的想法(而不是在运行时或通过单独的构建工具进行计算)在编译器之外)。 C ++通过多种方式使之成为可能,其中有两种:

  • 模板确实可以用于计算任意内容,这是称为“模板元编程”的一组技术。这主要是偶然的,因为它们根本不是为此目的而设计的,因此疯狂的语法和与旧编译器的斗争。但是在C ++ 03和之前的版本中,这就是我们所拥有的全部。

  • 在看到需要进行编译时计算之后,在C ++ 11中添加了
  • constexpr,并将其带回到了更加精明的领域。此后,它的工具带一直在扩展,只需在正确的位置添加constexpr,就可以在编译时运行越来越多看起来正常的代码。

也可以提到宏元编程,其中Boost.Preprocessor是一个很好的例子。但是,它比老式模板元编程更加诡秘和令人讨厌,因此,如果您有选择的话,您可能不想使用它。


0
投票

正如您所提到的,在cpp中,有两种评估编译时代码的方法-constexpr函数和template元编程。

这些解决方案之间有一些区别。 template选项较旧,因此受到更多编译器的支持。附加template保证在编译时评估,而constexpr有点像内联-仅建议编译器在编译时可以工作。对于templates,参数通常是通过模板参数列表传递的,而constexpr函数则将争论作为常规函数(它们实际上是)。 constexpr函数在某种程度上更好,可以在运行时将其称为常规函数。

现在很相似-必须在编译时评估其参数。因此,它们必须是文字值或其他编译时函数的结果。

说了这么多,让我们看一下编译时的max函数:

template<int a, int b>
struct max_template {
    static constexpr int value = a > b ? a : b;
};

constexpr int max_fun(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int x = 2;
    int y = 3;
    int foo = max_fun(3, 2); // can be evaluated at compile time
    int bar = max_template<3, 2>::value; // is surely evaluated at compile time
//  won't compile without compile-time arguments  
//  int bar2 = max_template<x, y>::value; // is surely evaluated at compile time
    int foo = max_fun(x, y); // will be evaluated at runtime
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.