
常量表达式
Item 1:如果函数必须在编译期进行求值,就将其声明为
Item 2: 以
发布日期:2021-05-09 00:21:37
浏览次数:18
分类:博客文章
本文共 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的变量一定是一个常量,并且必须用常量表达式初始化。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月11日 00时34分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Netty的体系结构及使用
2019-03-14
xshell解决文本粘贴格式错误
2019-03-14
什么是证券型代币?
2019-03-14
Android中获取并设置屏幕亮度
2019-03-14
Windows抓包工具-Fiddler
2019-03-14
Swift中使用DispatchGroup分组管理异步任务
2019-03-14
21-JS中常见的函数
2019-03-14
Android多线程与双缓冲
2019-03-14
MVVM_Template
2019-03-14
栈上内存溢出漏洞利用之Return Address
2019-03-14
Bugku CTF web29(Web)
2019-03-14
网络+图片加载框架(英文版)
2019-03-14
扣非净利润连续三年亏损,四维图新如何熬过“转型阵痛期”?
2019-03-14
前台报Invalid Host/Origin Header错误
2019-03-14
Python imageio方法示例
2019-03-14
Possible missing firmware
2019-03-14
算法的学习方式
2019-03-14
JAVA BigInteger和BigDecimal类常用方式
2019-03-14
深度学习框架 各种模型下载集合 -- models list
2019-03-14
双层卷积神经网络--tf
2019-03-14