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,这样可以将代码中的对象和函数能够使用的情景范围拓展至最大了。

发布了78 篇原创文章 · 获赞 11 · 访问量 5079

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/104219001