Effective Modern C++ 之 constexpr

  • 程序的执行分为编译阶段和运行阶段。为了让程序的执行时间最短,我们应该在编译阶段和运行阶段进行权衡。constexpr应用于对象时,对象具有const属性(加强版的const),其对象在编译阶段就已知。这些对象可能被存放在ROM里面(只读内存)。constexpr一般被使用在数组的尺寸规格,整型模板实参,枚举量的值和对齐规格中。
  • 我们应该有效的区别const和constexpr。constexpr对象都是const对象(constexpr是加强版的const),而并非所有的const对象都是constexpr(const对象只能说明该对象放在只读内存里,不能说明该内存里面的数据在编译器就已知)。

constexpr函数比constexpr对象更加复杂。如下:

  1. constexpr函数可以用在要求编译器常量的语境中。若你传给一个constexpr函数的实参值是在编译器已知,则函数的结果也会在编译器已知。
  2. 若你给constexpr函数的值有一个或多个在编译器未知,则它的运行结果和普通函数一样(函数的结果在运行期才可知)。所以我们可以知道传入的函数实参不同,constexpr函数所表达的意义也不同。
  • C++11中,constexpr函数不得包含多于一个可执行语句,即一条retrun语句。但是我们可以使用条件运算符和if-else语句。C++14中没有这个方面的限制。
  • constexpr函数仅限于传入和返回字面型别,意思就是这样的型别能够持有编译器可以决议的值。在C++11中,所有的内建类型,除了void,都符合这个条件,但是用户自定义型别同样也是字面型别。
  • constexpr是对象和函数的接口组成部分(与noexcept一样)。

所以,constexpr对象或者constexpr函数可以用在一个作用域更广的语境中,我们应该尽可能的使用constexpr,这样可以将代码中的对象和函数能够使用的情景范围拓展至最大了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值