当前位置: 首页 > news >正文

C++学习笔记 52 constexpr

constexpr

constexpr是 C++ 中用于声明编译时常量表达式的关键字‌,它要求变量、函数或构造函数的计算在编译时完成,而非运行时,从而提升程序性能。‌‌

基本概念与核心特性

constexpr 的核心是‌强制编译时计算‌,适用于变量、函数和类构造函数:

1‌. 变量声明‌:必须用常量表达式初始化,且类型为字面类型(如 int、float),否则编译报错。例如:

constexpr int x = 42;  // 正确:编译时初始化
constexpr int y = j + 1;  // 错误:j 非编译时常量

2. 函数要求‌

  • 参数和返回值必须是字面类型。
  • 函数体仅允许编译时可计算的操作(如 if、switch,但无 try 或 goto)。
  • 递归在 C++14 后允许,虚函数在 C++20 后支持。‌‌

3. ‌优势‌‌:‌减少运行时开销‌,例如数组大小、模板参数等场景可直接用编译结果,避免重复计算。‌‌

const 的关键区别

constexpr 和 const 都表示常量,但核心差异在‌计算时机‌:

1. 初始化时机‌‌
const:值可在运行时初始化(如 const int a = getValue();)。
constexpr:‌必须编译时初始化‌,值需为常量表达式。‌‌

‌‌2. 适用场景‌‌
const:通用只读变量(如 const int PI = 3.14;)。
constexpr:‌需编译时计算的场景‌(如数组大小 constexpr int size = 10; int arr[size];)。‌‌

‌‌3. 性能影响‌‌:constexpr 通过编译时计算‌消除运行时开销‌,而 const 仅保证值不可变。‌‌

实际应用与编译器支持

1. 代码示例‌:

  • 编译时计算阶乘:
constexpr int fac(int n) { return n <= 1 ? 1 : n * fac(n - 1); }
static_assert(fac(5) == 120);  // 编译时验证
  • C++23 扩展:std::bitset 和 std::unique_ptr 支持 constexpr,例如:
constexpr std::bitset<8> bits(42);  // 编译时初始化

2. 编译器支持‌:
‌C++11‌:基础支持,仅限简单表达式。
‌C++14‌:允许递归、局部变量和更多控制结构。
‌C++17‌:支持 if constexpr 和 constexpr lambda。
‌C++23‌:扩展至 std::bitset、std::unique_ptr 等库。‌‌

http://www.jsqmd.com/news/194397/

相关文章:

  • 常见4K HDR信号的视频格式HLG或PQ映射
  • ssm社区宠物信息管理系统vue
  • 导师推荐8个一键生成论文工具,MBA毕业论文轻松搞定!
  • ssm院线票务系统 电影院 售票选座vue
  • 基于主从博弈理论的共享储能与微网优化运行研究:Stackelberg均衡解的存在唯一性及MAT...
  • ssm面向中小企业的人力资源培训绩效信息管理系统vue
  • DM8数据库配置深度实践与国产化生态思考
  • dubbo从1.0升级到3
  • 基于springboot框架的创意方案评选平台发布的设计与实现vue
  • 2026年粉底液瓶订制厂家top5推荐,广东广州等地优质品牌深度解析及选择指南 - 全局中转站
  • 102302125 数据采集第4次作业
  • MulVal安装记录
  • 2026 MBA必备!9个降AI率工具测评榜单
  • TensorFlow自动微分提速技巧
  • 【专业词汇】人类情绪的精细光谱:27种情绪与传统“七情”的对比
  • 学长亲荐!自考必备8款一键生成论文工具TOP8测评
  • 如何使用jmeter进行压测
  • QGroundControl
  • 全网最全10个AI论文平台,本科生轻松搞定毕业论文!
  • Python自动化测试学习-PO设计模式
  • HTTP服务器建立请求解析与响应构建:从基础架构到动态交互
  • 设计一个“完美“的测试用例,用户登录模块实例...
  • 一文告诉你黑盒测试、白盒测试、集成测试和系统测试的区别与联系
  • 一文讲透彻!RobotFramwork测试框架教程(全能)
  • 介绍java中常用于处理 Excel 档案的Apache POI
  • 明日方舟作战记录
  • 永久隐藏机械革命控制台右下角托盘图标方法
  • 2026年护肤品包材订制厂家top5推荐,广东广州等地优质品牌深度解析及选择指南 - 全局中转站
  • 3DMAX自由切割器插件FreeSlicer使用方法详解 - 实践
  • apache更换其他目录后显示403无法访问