• Modern C++ 之constexpr


    引言

    C++在很早就有了常量表达式的概念,例如3+4,常量表达式是指值不会改变并且在编译过程中就可以得到结果的表达式。如果常量表达式可以直接优化并且在程序编译阶段的时候就写入程序中,将会提高程序的性能。下面就用一个简单的数组例子来说明

    #include <iostream>
    #define LEN 10
    
    int len_foo()
    {
        return 2;
    }
    
    constexpr int len_foo_constexpr()
    {
        return 5;
    }
    
    constexpr int fibonacci(const int n)
    {
        return n == 1 || n == 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
    }
    
    int main()
    {
        char arr_1[10];    // 合法定义
        char arr_2[LEN];    // 合法定义
        
        int len = 3;
        // char arr_3[len]; 这是不合法定义
    
       const int len_2 = len + 1;
        // char arr_4[len_2];    len_2 不是常量表达式,不合法
    
        constexpr int len_3 = 1 + 2;    
        char arr_5[len_3];    // 合法定义
    
        // char arr_6[len_foo() + 4);    非法定义
        char arr_7[len_foo_constexpr() + 2);    // 合法定义
    
        std::cout << fibonacci(10) << std::endl;
    
        return 0;
    }
    

    在上面的例子中,char arr_4[len_2] 仍然是非法定义的,这是因为len_2是常量,而不是常量表达式。虽然在上面的例子中我们自己可以明显看出来某些函数返回的就是常量,但是编译器认为不行,这不符合人们的常识。为了解决前面的困惑,C++引入了新的关键字constexpr.

    constexpt可以明确的说明某个函数或者对象在编译的时候就是一个常量表达式,例如上面的函数len_foo_constexpr的返回值就是一个常量表达式。

    并且,从C++14开始,constexpr函数就可以在函数内部,例如在循环或者局部变量等地方使用一些简单的语句,例如上面例子的fibonacci函数,这段函数代码在C++11以前是不能够编译通过的;

    总结

    • const可以用来修饰常量,并且只有初始值是常量表达式的时候,const的修饰对象才是一个常量表达式,否则就是一个常量;
    • constexpr用来定义常量表达式,也就是说我们认为某个值就是常量表达式的时候就可以使用constexpr;
  • 相关阅读:
    mysql-workbench-community报错解决办法
    前端技术交流群
    h5页面在浏览器上好好的,到手机上熄火了又看不到报错信息怎么办?
    【面试篇】金九银十面试季,这些面试题你都会了吗?
    [译]8个惊人的HTML按钮悬停效果,不看后悔一辈子
    'Component' is defined but never used
    DNS协议
    HTTP协议
    套接字Socket
    GYM102219H Are You Safe?(凸包)
  • 原文地址:https://www.cnblogs.com/zuixime0515/p/12466424.html
Copyright © 2020-2023  润新知