0

0

c++的constexpr关键字是什么 如何在编译期进行计算【性能优化】

穿越時空

穿越時空

发布时间:2025-12-30 12:12:08

|

781人浏览过

|

来源于php中文网

原创

constexpr 是 C++ 中要求实体必须在编译期求值的关键字,用于声明编译期常量和可在编译期执行的函数,支撑元编程、模板推导、数组大小定义等核心特性。

c++的constexpr关键字是什么 如何在编译期进行计算【性能优化】

constexpr 是 C++ 中用于声明“可在编译期求值”的变量、函数或对象的关键字。它不是简单地“建议”编译器优化,而是对语义的约束:被标记为 constexpr 的实体,**必须能在编译期计算出确定结果**(前提是其参数/初始化表达式也满足编译期可求值条件)。这直接支撑了元编程、模板推导、数组大小定义、if constexpr 分支等关键特性,是现代 C++ 性能优化和类型安全的重要基石。

constexpr 变量:编译期常量的明确声明

声明一个 constexpr 变量,意味着它的值在编译时就已确定,且不可修改。编译器会强制检查初始化表达式是否满足“核心常量表达式”(core constant expression)要求。

  • 只能用字面量、其他 constexpr 变量、允许在编译期调用的 constexpr 函数来初始化
  • 例如:constexpr int N = 10 + 5; ✅(纯字面量运算)
    constexpr int M = std::sqrt(16); ❌(std::sqrt 在 C++20 前非 constexpr)
  • 用途:定义数组长度、模板非类型参数、枚举值、静态断言条件等

constexpr 函数:编译期可执行的“纯函数”

constexpr 函数不等于“一定会在编译期运行”,而表示“**如果传入的参数都是字面量或编译期可知的值,那么该函数调用就可在编译期完成**”。C++14 起放宽限制,支持局部变量、循环、条件分支等;C++20 进一步支持 try/catch、动态内存(有限)、虚函数调用等。

  • 函数体需满足“核心常量表达式”规则(早期较严,新版更宽松)
  • 示例(C++14+):constexpr int factorial(int n) { return n
    调用 constexpr int f5 = factorial(5); → 编译期算出 120
  • 若参数含运行时值(如用户输入),则退化为普通函数调用,不报错但失去编译期优势

constexpr 构造函数与字面量类(Literal Types)

类若想拥有 constexpr 对象,需满足:所有成员变量为字面量类型,且至少有一个 constexpr 构造函数。这类类称为“字面量类”,其对象可在编译期创建和使用。

Copysmith
Copysmith

Copysmith是一款面向企业的 AI 内容创建解决方案

下载

立即学习C++免费学习笔记(深入)”;

  • 构造函数、成员函数、析构函数(C++20)均可标记为 constexpr
  • 典型应用:自定义编译期字符串、小型数学向量、状态机配置结构体等
  • 例如:struct Point { constexpr Point(int x, int y) : x(x), y(y) {} int x, y; }; constexpr Point p{3, 4};

性能优化的关键逻辑与注意事项

使用 constexpr 的真正价值,在于把本该在运行时做的计算提前到编译阶段,从而消除重复开销、减少二进制体积、提升缓存友好性,并支持更强的编译期检查。

  • 不是所有计算都适合 constexpr:递归过深、依赖 I/O 或全局状态、涉及未定义行为的表达式会被拒绝
  • 编译时间可能增加:复杂 constexpr 计算(如编译期 JSON 解析、正则匹配)会延长构建过程
  • 务必配合 consteval(C++20):当需要“强制仅在编译期求值”时使用,比 constexpr 更严格
  • 调试提示:GCC/Clang 报错 “call to non-constexpr function” 表明某处违反了编译期约束,需逐层检查参数和函数定义

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1434

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

710

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

519

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

188

2025.08.29

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

95

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

70

2025.11.13

excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

30

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.6万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号