博客
关于我
常量表达式
阅读量:400 次
发布时间:2019-03-06

本文共 875 字,大约阅读时间需要 2 分钟。

常量表达式

Item 1:如果函数必须在编译期进行求值,就将其声明为constexpr

理由

需要用constexpr来告诉编译器允许对其进行编译期求值。

示例

阶乘的例子:

constexpr int fac(int n)    //constexpr函数{return (n>1) ? n*fac(n-1) : 1;}void f(int n){int f5 = fac(5);            //在编译期间可能进行了求值int fn = fac(n);            //在运行期间进行了求值(因为实参n是变量)constexpr int f6 = fac(6);  //在编译期间进行了求值constexpr int fnn = fac(n); //错误:无法在编译期求值,因为n的值在运行期才能得到}

上例中给出了constexpr函数fac()的定义,在f()中列举了几种调用fac()的情形。在这里,编译期间能够求值的前提是fac()要为constexpr函数,此外还要保证其实参为常量,表达式被赋值变量为constexpr类型。

注解

不要试图让所有函数都变成 constexpr。大多数计算都最好在运行时进行。

任何可能最终将依赖于高层次的运行时配置或者业务逻辑的API,都不应当是 constexpr 的。这种定制化是无法由编译期来求值的,并且依赖于这种 API 的任何 constexpr 函数也都应当进行重构,或者抛弃掉 constexpr

Item 2: 以 constexpr 来定义可以在编译期计算的值

理由

更好的性能,更好的编译期检查。

示例
constexpr int f6 = fac(6);  //在编译期间进行了求值constexpr int fnn = fac(n); //错误:无法在编译期求值,因为n的值在运行期才能得到
注解

将变量声明为constexpr类型,编译器可以来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化。

转载地址:http://labkz.baihongyu.com/

你可能感兴趣的文章
SpringBoot中的自动代码生成 - 基于Mybatis-Plus
查看>>
对象的可见性 - volatile篇
查看>>
端口重用
查看>>
应届生/社招面试最爱问的几道Java基础问题
查看>>
为什么面试完,总是让你回去等通知?
查看>>
Java 中初始化 List 集合的 6 种方式!
查看>>
终于有人把 HTTPS 原理讲清楚了!
查看>>
IntelliJ IDEA 高级调试技巧,用得非常爽!
查看>>
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
查看>>
在滴滴和头条干了 2 年后端开发,太真实…
查看>>
Dubbo 的心跳设计,值得学习!
查看>>
送给你 12 个 Git 使用技巧!
查看>>
国人开源了一款超好用的 Redis 客户端,真香!!
查看>>
盘点 100 个最受欢迎的 Java 库!谁拔得头筹?
查看>>
使用 Redis 实现一个轻量级的搜索引擎,牛逼!
查看>>
你还在用分页?试试 MyBatis 流式查询,真心强大!
查看>>
如何写出让同事无法维护的代码?
查看>>
查看 JVM 内存的几个工具,建议收藏!
查看>>
每天数十亿次请求的应用经验分享,值得参考!
查看>>
推荐一款 ES 集群可视化工具:Cerebro,简单、实用!
查看>>