📜  C ++中的立即函数

📅  最后修改于: 2021-05-31 22:43:25             🧑  作者: Mango

在本文中,我们将讨论C++中使用的立即函数。

立即函数

  • 在C++ 20中,立即函数是一个函数,其中对该函数的每次调用都直接或间接生成编译时常量表达式。
  • 这些函数通过在返回类型之前使用consteval关键字进行声明。

下面给出了一些与即时函数有关的重要术语:

constexpr函数

  • constexpr说明符声明可以在编译时评估函数或变量的值。
  • 这样的变量和函数可以在只允许编译时常量表达式的地方使用。
  • 这些函数用于通过在编译时(而不是运行时)进行计算来提高程序的性能。
  • 这些函数确实很有帮助,因为多次执行一个程序,因为常量表达式在编译期间只会被评估一次。

以下是说明constexpr函数用法的C++程序:

C++14
// C++ program demonstrates the use of
// constexpr
#include 
using namespace std;
  
// Constexpr function if replaced with
// consteval, program works fine
constexpr int fib(int n)
{
    // Base Case
    if (n <= 1)
        return n;
  
    // Find the Fibonacci Number
    return fib(n - 1) + fib(n - 2);
}
  
// Driver Code
int main()
{
    // Constant expression evaluated
    // at compile time
    const int val = fib(22);
  
    cout << "The fibonacci number "
         << "is: " << val << "\n";
  
    return 0;
}


C++14
// C++ program illustrating the use
// of the consteval function
  
#include 
using namespace std;
  
// If constexpr replaces with consteval
// program gives an error in C++20
constexpr int fib(int n)
{
    // Base Case
    if (n <= 1)
        return n;
  
    return fib(n - 1) + fib(n - 2);
}
  
// Driver Code
int main()
{
    // This expression is not evaluated
    // at compile time
    const int val = fib(rand() % 20);
  
    cout << "The fibonacci number is: "
         << val << "\n";
  
    return 0;
}


输出
The fibonacci number is: 17711

解释:

  • 在上面的示例中, fib()22调用。
  • 这就是为什么它是一个常量表达式,因此可以在编译时对其求值。
  • 该程序在使用constexprconsteval时均未显示任何错误。
  • 但是,如果在使用consteval关键字时使用了常量表达式,则程序将产生错误。

年代函数

  • consteval函数,该函数每次调用必须直接或间接产生一个编译时间常量表达式。
  • consteval函数与constexpr函数相同,不同之处在于,如果对consteval函数的调用未求出编译时常量表达式的值,则程序会给出错误,而对于constexpr函数则不是。
  • constexpr指定变量或函数的值可以出现在常量表达式中。
  • 这里要注意的关键是它说一个函数可以出现在常量表达式中,而不必说该函数必须存在,而consteval指定该函数是一个直接函数,即对该函数的每次调用必须产生一个编译时常量。

下面是说明consteval函数用法的C++程序:

C++ 14

// C++ program illustrating the use
// of the consteval function
  
#include 
using namespace std;
  
// If constexpr replaces with consteval
// program gives an error in C++20
constexpr int fib(int n)
{
    // Base Case
    if (n <= 1)
        return n;
  
    return fib(n - 1) + fib(n - 2);
}
  
// Driver Code
int main()
{
    // This expression is not evaluated
    // at compile time
    const int val = fib(rand() % 20);
  
    cout << "The fibonacci number is: "
         << val << "\n";
  
    return 0;
}
输出
The fibonacci number is: 2

解释:

  • 在上面的示例中,使用了rand() ,并且在运行时而不是编译时对rand()进行了评估,因此,该表达式不再是常量表达式,这就是为什么我们的consteval函数现在将产生错误的原因。
  • 尽管constexpr函数仍然可以正常工作,原因是它不必在编译时。

结论:

  • 从以上讨论可以得出结论,即时函数是consteval函数,仅当每次对该函数的调用必须直接或间接生成编译时常量表达式否则给出错误时,该函数才能正常工作。
  • 这些函数通过在返回类型之前使用consteval关键字进行声明,并用于减少在评估常量表达式时所花费的时间,因为它们在编译时仅评估一次常量表达式,而在程序的每次运行/执行过程中均仅评估一次。
  • 因此,当需要多次执行带有某些常量表达式的程序时,可以节省大量时间。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”