服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

constexpr

日期: 来源:程序喵大人收集编辑:程序喵大人

前面介绍了模板这种编译期动作,关于编译期动作,有必要介绍下constexpr。


在这之前有必要简单提一下constexpr与const的关系,两者字面上都表达常量的意思。


主要的区别是:const修饰的变量可以在运行时才初始化,而constexpr则一定会在编译期初始化。


constexpr才是名符其实的常量,所有的constexpr都是const。


而const表示的是read only的语义,保证修饰的变量运行时不可以更改,如果直接改动它,编译器在编译时会报错。const修饰的变量可以在运行时才初始化,而constexpr则一定会在编译期初始化。


有人可能会用指针等骚操作来修改const修饰的变量值,这种情况下,CPP标准规定产生的是未定义行为,具体可能不同编译器的具体行为会不相同。所以骚操作魔改const后,无论产生什么行为,都没必要奇怪,也没必要深究。



下面具体介绍下constexpr


如上所述,constexpr修饰的才是真正的常量,它会在编译期间计算出来,整个运行过程中都不可被改变。


constexpr还可用于修饰函数,这个函数的返回值会尽可能在编译期间被计算出来,然后作为一个常量,但是如果编译期间不能被计算出,此函数就是被当作一个普通函数处理。


如何使用constexpr?


这里我直接贴出cppreference中的示例代码:

#include <iostream>#include <stdexcept>// C++11 constexpr functions use recursion rather than iteration// (C++14 constexpr functions may use local variables and loops)constexpr int factorial(int n) { return n <= 1 ? 1 : (n factorial(n - 1)); }
// literal classclass conststr { const char p; std::size_t sz;public: template <std::size_t N> constexpr conststr(const char (&a)[N]) : p(a), sz(N - 1) {} // constexpr functions signal errors by throwing exceptions // in C++11, they must do so from the conditional operator ?: constexpr char operator[](std::size_t n) const { return n < sz ? p[n] : throw std::out_of_range(""); }
constexpr std::size_t size() const { return sz; }};
// C++11 constexpr functions had to put everything in a single return statement// (C++14 doesn't have that requirement)constexpr std::size_t countlower(conststr s, std::size_t n = 0, std::size_t c = 0) { return n == s.size() ? c : 'a' <= s[n] && s[n] <= 'z' ? countlower(s, n + 1, c + 1) : countlower(s, n + 1, c);}
// output function that requires a compile-time constant, for testingtemplate <int n>struct constN { constN() { std::cout << n << '\n'; }};
int main() { std::cout << "4! = "; constN<factorial(4)> out1; // computed at compile time volatile int k = 8; // disallow optimization using volatile std::cout << k << "! = " << factorial(k) << '\n'; // computed at run time
std::cout << "the number of lowercase letters in \"Hello, world!\" is "; constN<countlower("Hello, world!")> out2; // implicitly converted to conststr}


可以大体观察到constexpr的语法如下:

constexpr literal-type identifier = constant-expression ;constexpr literal-type identifier { constant-expression } ;constexpr literal-type identifier ( params ) ;constexpr ctor ( params ) ;


通过示例代码及相关注释,就可以看到,能在编译期做constexpr就会优先在编译期计算,编译期不行就在运行时计算。


也可以看到,在C++14之前constexpr修饰函数时不能有if-else for循环等语句,而在C++14后,这个问题有了改善。


那什么情况下应该使用constexpr修饰函数?


不在乎编译时间的话,尽可能用constexpr修饰所有的函数,大家有时间可以看看cpp的源码,多数成员函数都是使用的constexpr修饰。


思考题

constexpr有一个条件是需要满足literal type,那literal type究竟是什么类型?


推荐阅读:

https://docs.microsoft.com/en-us/cpp/cpp/constexpr-cpp?view=msvc-170


参考资料

https://en.cppreference.com/w/cpp/language/constexpr

相关阅读

  • 20230217【外交部例行记者会】文字版

  • 此条是每日外交部例行记者会的全文,三弄解读完每日新闻联播已经没有余力解读外交部例行记者会的内容了,弄友们可以自行查看学习。欢迎关注
  • 万字长文教你如何做出 ChatGPT

  • 作者:monychen,腾讯 IEG 应用研究员简单来说,ChatGPT 是自然语言处理(NLP)和强化学习(RL)的一次成功结合,考虑到读者可能只熟悉其中一个方向或者两个方向都不太熟悉,本文会将 ChatGPT
  • 谁还记得元宇宙?

  • 作为科技圈的“新贵”,ChatGPT的出圈几乎“复制”了元宇宙的路径,它会步元宇宙的后尘吗?文 | 于惠如编辑 | 罗丽娟两天前,手握5000万美元的美团联合创始人王慧文在社交App即刻上
  • 稳定的前70%,真的很容易吗?

  • 以下文章来源于猫头鹰研究小分队,作者猫头鹰 Niko前70%,看似是一个并不起眼的排名,但是如果是每季度都排在前70%呢?我们整理了近三年(2020Q1至2022Q4)连续十二个季度都稳居同类前7
  • 2023 ABCA-7(The Second Announcement)

  • 2023 ABCA-7The Seventh International Forum on Cathode & Anode Materialsfor Advanced Batteries and The First Independent Sodium Battery Technology and Market Dev
  • IcedID僵尸网络滥用谷歌 PPC服务分发恶意软件

  • 关键词IcedID僵尸网络、谷歌 PPC、恶意软件1. 概述在密切跟踪 IcedID 僵尸网络的活动后,趋势科技的研究人员发现其分发方法发生了一些重大变化。自 2022 年 12 月以来, 趋势科

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • constexpr

  • 前面介绍了模板这种编译期动作,关于编译期动作,有必要介绍下constexpr。在这之前有必要简单提一下constexpr与const的关系,两者字面上都表达常量的意思。主要的区别是:const修饰
  • 操作系统:文件系统的实现

  • 一、文件系统结构磁盘的逻辑单元为块,内存和磁盘之间的I/O传输以块为单位执行。磁盘的特点1可以原地重写,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置可以直接访问磁
  • 用chatGPT生成C++代码

  • 众所周知,chatGPT可以不依赖背景立即有效地回答不精确的问题。它提供带有工作代码的答案。一位美国的Telegram算法交易员,以其所在的项目组的实际问题进行了测试,问题如下:“有
  • 了解 Flutter 开发者们的 IDE 使用情况

  • 作者 / JaYoung Lee, UX Researcher at GoogleGoogle 的 Flutter 团队负责构建和维护 Android Studio (基于 IntelliJ-IDEA) 和 Visual Studio Code (VS Code) 的支持。我们