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

constexpr 是 C++11 引入的关键字

constexpr 是 C++11 引入的关键字,用于在编译期进行常量表达式计算,从而提高程序性能和安全性。以下是其核心作用和用法:

一.作用

1编译期
计算 constexpr 变量或函数的值在编译时确定,避免运行时计算开销。例如,数组大小、模板参数等需要在编译期确定的场景。

2 类型安全
相比宏(#define),constexpr 提供类型检查,避免宏替换带来的潜在错误。

3代码优化
编译器可以在编译期优化 constexpr 相关的计算,减少运行时负担。

4支持模板元编程
constexpr 函数可用于生成编译时常量,简化模板元编程逻辑。

二. 用法

1. 定义常量表达式变量

constexpr int MAX_SIZE = 100;  // 编译时常量
int arr[MAX_SIZE];             // 合法,MAX_SIZE 在编译期已知

2. 定义常量表达式函数

要求:函数体只能包含返回语句或静态断言,参数和返回值必须是字面类型(如基本类型、枚举、指针等)。

constexpr int square(int x) {return x * x;
}int main() {constexpr int val = square(10);  // 编译期计算,val = 100int arr[val];                   // 合法
}

3. 定义常量表达式构造函数(C++11 起)

要求:构造函数体只能包含简单的初始化逻辑。

struct Point {int x, y;constexpr Point(int x, int y) : x(x), y(y) {}
};
constexpr Point p(1, 2);  // p 在编译期构造

4. C++14 及更高版本的扩展

更复杂的逻辑:constexpr 函数可以包含局部变量、循环、条件语句等。

constexpr int factorial(int n) {int result = 1;for (int i = 1; i <= n; ++i) {result *= i;}return result;
}constexpr int fact_5 = factorial(5);  // 编译期计算,fact_5 = 120

5. 用于模板参数

template <int N>
void printArraySize() {std::cout << "Array size: " << N << std::endl;
}constexpr int size = 10;
printArraySize<size>();  // 输出:Array size: 10

注意事项

constexpr 变量必须初始化且初始值必须是常量表达式。
constexpr 函数的参数和返回值必须是字面类型不能是动态分配的对象或包含运行时行为的类型。
与 const 的区别const:仅表示值不可修改,但可以在运行时初始化。constexpr:要求值必须在编译期确定,且必须是常量表达式。

总结
constexpr 是 C++ 中用于编译期计算的关键特性,适用于需要编译期常量的场景(如数组大小、模板参数等)。通过合理使用 constexpr,可以提高程序性能、增强类型安全,并简化模板元编程逻辑。

三.const 与constexpr 区别

const
表示“不可修改”,适用于运行时逻辑,防止意外修改对象或变量。
constexpr
表示“编译期常量”,适用于需要编译期优化的场景(如数组大小、模板参数),要求值必须在编译期确定。

1. 初始化时间

const
const 变量可以在运行时初始化,其值在初始化后不可修改。例如:
int main() {const int x = getInput();  // 运行时初始化(合法)x = 10;                   // 错误:const 变量不可修改
}
constexpr
constexpr 变量必须在编译期初始化,其值必须是常量表达式。例如:constexpr int y = 10;  // 编译期初始化(合法)
constexpr int z = getInput();  // 错误:getInput() 不是编译期常量

2. 函数和变量

const 函数
const 用于成员函数,表示函数不会修改对象的状态:class MyClass {
public:int getValue() const { return value_; }  // 不会修改对象
private:int value_;
};
constexpr 函数
constexpr 函数必须在编译期可计算,且其返回值是常量表达式:constexpr int square(int x) { return x * x; }int main() {constexpr int val = square(5);  // 编译期计算(合法)
}

3. 构造函数

const 对象
const 对象必须在初始化时赋值,且不能修改:const int a = 10;  // 合法
a = 20;            // 错误:const 对象不可修改
constexpr 构造函数
constexpr 构造函数用于构造编译期常量对象,其初始化列表和函数体必须满足 constexpr 
struct Point {int x, y;constexpr Point(int x, int y) : x(x), y(y) {}
};constexpr Point p(1, 2);  // p 在编译期构造

4. 使用场景

const
适用于需要防止意外修改的场景,例如:

函数参数(防止修改):void print(const std::string& str) { /* ... */ }
成员变量(防止修改):class MyClass {
public:const int id_;  // 初始化后不可修改MyClass(int id) : id_(id) {}
};

constexpr
适用于需要编译期常量的场景,例如:

数组大小:constexpr int SIZE = 100;
int arr[SIZE];  // 合法,SIZE 在编译期已知
模板参数:template <int N>
void printArraySize() {std::cout << "Array size: " << N << std::endl;
}constexpr int size = 10;
printArraySize<size>();  // 输出:Array size: 10

相关文章:

constexpr 是 C++11 引入的关键字

constexpr 是 C11 引入的关键字&#xff0c;用于在编译期进行常量表达式计算&#xff0c;从而提高程序性能和安全性。以下是其核心作用和用法&#xff1a; 一.作用 1编译期 计算 constexpr 变量或函数的值在编译时确定&#xff0c;避免运行时计算开销。例如&#xff0c;数组大…...

【更新中】(文档+代码)基于推荐算法和Springboot+Vue的购物商城

概要设计 本节规划和定义了Woodnet桌游电商平台的软件概要设计说明书&#xff0c;描述了软件的总体设计、接口设计、运行设计、系统数据库结构设计以及系统出错处理设计&#xff0c;从整体上说明了系统设计的结构层次、处理流程、系统用例等。 本系统是一个独立的系统&#x…...

六种高阶微分方程的特解(原创:daode3056)

高阶微分方程的通解是指包含所有可能解的解的表达式。对于一个 n 阶微分方程&#xff0c;其通解通常包含 n 个任意常数。这些任意常数可以通过初始条件或边界条件来确定。高阶微分方程的特解是指在通解中&#xff0c;特定地选择了一组常数&#xff0c;使得解满足给定的初始条件…...

【C++11(上)】—— 我与C++的不解之缘(三十)

一、C11 这里简单了解一下C发展好吧&#xff1a; C11是C的第二个大版本&#xff0c;也是自C98以来最重要的一个版本。 它引入了大量的更改&#xff0c;它曾被人们称为C0x&#xff0c;因为它被期待在2010年之前发布&#xff1b;但在2011年8月12日才被采纳。 C03到C11花了8年时间…...

【多线程初阶】wait() notify()

文章目录 协调多个线程间的执行顺序join 和 wait 区别sleep 和 wait 区别 wait()方法线程饿死调用 wait()唤醒 wait() notify()方法wait() 和 notify() 需对同一对象使用确保先 wait ,后 notify多个线程在同一对象上wait notify随机唤醒一个wait notifyAll()方法应用 wait() 和…...

安全-JAVA开发-第二天

Web资源访问的流程 由此可见 客户访问JAVA开发的应用时 会先通过 监听器&#xff08;Listener&#xff09;和 过滤器&#xff08;Filter&#xff09; 今天简单的了解下这两个模块的开发过程 监听器&#xff08;Listener&#xff09; 主要是监听 我们触发了什么行为 并进行反应…...

Python基础:文件简单操作

&#x1f343;引言 手把手带你快速上手Python Python基础专栏 一、&#x1f343;文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失。 要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存。 通过文件的后缀名, 可以看…...

深度学习项目之RT-DETR训练自己数据集

RT-DETR 1.模型介绍&#x1f4cc; 什么是 RT-DETR &#xff1f;&#x1f4d6; 核心改进点&#x1f4ca; 结构示意&#x1f3af; RT-DETR 优势⚠️ RT-DETR 缺点&#x1f4c8; 应用场景&#x1f4d1; 论文 & 官方仓库2.模型框架3.Yaml配置文件4.训练脚本5.训练完成截图6.总结…...

以太网帧结构和封装【二】-- IP头部信息

1字节 byte 8比特 bit 【位和比特是同一个概念】 比特/位&#xff0c;字节之间的关系是&#xff1a; 位&#xff08;Bit&#xff09; 中文名&#xff1a;位&#xff08;二进制位&#xff09;。 英文名&#xff1a;Bit&#xff08;Binary Digit 的缩写&#xff09;。 含义&…...

mysql 悲观锁和乐观锁(—悲观锁)

适合悲观锁的使用场景&#xff1a; 悲观锁更适合在&#xff0c;写操作较多、并发冲突高、业务需要强一致性等场景下使用悲观锁。 如何使用悲观锁&#xff1a; 悲观锁主要通过以下两个 SQL语句实现&#xff1a; 1、SELECT...FOR UPDATE; 这个语句会在所查询中的数据行上设置排…...

Promtail采集服务器本地日志存储到Loki

✅ 一、前提条件 已安装 Loki 服务 日志文件目录可访问&#xff08;如 /var/log&#xff09; 具备 sudo 权限 &#x1f9e9; 二、下载 Promtail 二进制文件 # 替换为你想要的版本 VERSION"3.5.1"# 创建目录 sudo mkdir -p /opt/promtail cd /opt/promtail# 下载并…...

python第31天打卡

import numpy as np from tensorflow import keras from tensorflow.keras import layers, optimizers, utils, datasets# 数据加载和预处理函数 def load_and_preprocess_data():(x_train, y_train), (x_test, y_test) datasets.mnist.load_data()# 重塑并归一化图像数据x_tr…...

4.1 HarmonyOS NEXT原生AI能力集成:盘古大模型端侧部署与多模态交互实战

HarmonyOS NEXT原生AI能力集成&#xff1a;盘古大模型端侧部署与多模态交互实战 在HarmonyOS NEXT的全场景生态中&#xff0c;原生AI能力成为连接设备、服务与用户的核心纽带。通过盘古大模型端侧轻量化部署、多模态交互技术及环境感知系统&#xff0c;开发者能够构建"主…...

学习STC51单片机27(芯片为STC89C52RCRC)

每日一言 你读过的书、走过的路、流过的汗&#xff0c;终将成就独一无二的你。 硬件&#xff1a;LCD1602液晶显示 非标协议外设 概述 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 那我…...

PAT-甲级JAVA题解(更新中...)

使用JAVA语言进行算法练习,但是有些会出现运行超时情况. 题目链接A1001A1001-PAT甲级JAVA题解 AB FormatA1005A1005-PAT甲级JAVA题解 Spell It RightA1006A1006-PAT甲级JAVA题解 Sign In and Sign OutA1011A1011-PAT甲级JAVA题解World Cup BettingA1012A1012 PAT甲级JAVA题解 …...

Deep Chat:重塑人机对话边界的开源智能对话框架—— 让下一代AI交互无缝融入你的应用

在AI助手泛滥的今天&#xff0c;开发体验碎片化、功能扩展性差、多模态支持不足成为行业痛点。由开发者Ovidijus Parsiunas发起的开源项目 Deep Chat&#xff08;https://github.com/OvidijusParsiunas/deep-chat&#xff09;&#xff0c;正以模块化设计 全栈兼容性颠覆传统聊…...

DA14531_beacon_大小信标设备开发

蓝牙信标是一款通过广播指定蓝牙信号&#xff0c;实现信标信号扫描、识别和获得辅助信息的电子产品。 不同品名的蓝牙信标采用相同的 UUID 和广播信号格式&#xff0c;但在 MAC 地址、工作寿命、体积和广播周期上有所差异。 小武编程巧用DA14531开发一款蓝牙信标....

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接&#xff1a;454. 四数相加 II 这个题注意它只需要给出次数&#xff0c;而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来&#xff0c;再将后两个数组的加和情况使用map存储起来&#xff0c;ke…...

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况&#xff1a; 公式文献 等我下学期有时间了&#xff0c;一定要学习Latex啊&#xff0c;word写英文论文&#xff0c;不论是排版还是公式都很麻烦的&#xff0c;而Latex一键就…...

乡村三维建模 | 江苏农田无人机建模案例

测绘是农田建设的基础工作&#xff0c;测绘的质量和效率直接影响农田建设的进度和成果。传统的人工测量、地面测量等测绘手段&#xff0c;存在效率低、精度差、受环境影响大、成本高等缺点&#xff0c;难以满足高标准农田建设的要求。而无人机倾斜摄影技术具有高效、精确、灵活…...

2025 5 月 学习笔记

计算高斯半径&#xff0c;用于生成高斯热图 这个的意义是什么 有什么作用&#xff1f; 14 核心意义&#xff1a;平衡定位精度与检测鲁棒性 在基于热图的目标检测方法&#xff08;如CenterNet、CornerNet等&#xff09;中&#xff0c;计算高斯半径的核心意义在于​​在精确…...

SpringBoot(七) --- Redis基础

目录 前言 一、Redis入门 二、Redis常用数据类型 三、Redis常用命令 1. 字符串操作命令 2. 哈希操作命令 3. 列表操作命令 4. 集合操作命令 5. 有序集合操作命令 6.通用命令 四、在Java中操作Redis 前言 Redis是一个基于内存的key-value结构数据库&#xff0c;有以下…...

Oracle 故障实例 - 通过备份恢复到某时间点 故障恢复

一、环境和故障描述 1.数据库版本&#xff1a;oracle 11g , linux &#xff1b;OA系统的后台数据库。 2. 同事在做正式机数据迁移到测试机时&#xff0c;不小心删除了正式机的数据。 导致大量生产数据丢失&#xff0c;系统故障。 3.万幸的是正式机每日都做了数据备份&#x…...

滑动智能降级:Glide优化加载性能的黑科技

简介 在移动应用开发中,图片加载性能直接关系到用户体验,尤其在列表快速滑动场景下,如何平衡流畅度与流量消耗成为开发者面临的核心挑战。本文将深入探讨Glide库的智能降级技术,通过滑动速度动态调整图片加载策略,实现流量节省35%、首屏加载速度提升40%的显著效果。我们将…...

【前端并发请求控制:必要性与实现策略】

前端并发请求控制&#xff1a;必要性与实现策略 一、引言 在现代 Web 开发中&#xff0c;处理大量异步请求是一个常见场景。虽然浏览器和服务器都有其并发限制机制&#xff0c;但前端实现并发控制仍然具有其独特的价值和必要性。本文将深入探讨这个话题。 二、现有的并发限制…...

LeetCode 139. 单词拆分(Word Break) - 动态规划深度解析

文章目录 问题描述动态规划解法解法核心思路完整代码实现关键代码解析1. 数据结构初始化2. 动态规划数组3. 核心循环逻辑4. 子串区间理解(关键)示例演算复杂度分析算法优化点总结本文详细解析LeetCode 139题"单词拆分"的动态规划解法,涵盖核心思路、代码实现、区间…...

@Prometheus动态配置管理-ConsulConfd

文章目录 动态配置管理 Consul Confd**一、目标****二、架构组件****三、环境准备****四、配置 Consul**1. 注册监控目标&#xff08;服务发现&#xff09;2. 存储告警规则&#xff08;KV 存储&#xff09; **五、配置 Confd**1. 监控目标模板配置2. 告警规则模板配置 **六、配…...

CentOS7 + JDK8 虚拟机安装与 Hadoop + Spark 集群搭建实践

前言 在大数据时代&#xff0c;Hadoop 和 Spark 是两种非常重要的分布式计算框架。本文将详细介绍如何在 CentOS7 JDK8 的虚拟机环境中搭建 Hadoop Spark 分布式集群&#xff0c;包括 Spark Standalone 和 Hadoop Spark on YARN 两种模式&#xff0c;并提供具体的代码示例。…...

从OSI到TCP/IP:网络协议的演变与作用

个人主页&#xff1a;chian-ocean 文章专栏-NET 从OSI到TCP/IP&#xff1a;网络协议的演变与作用 个人主页&#xff1a;chian-ocean文章专栏-NET 前言网络发展LANWAN 协议举个例子&#xff1a; 协议的产生背景 协议的标准化OSI模型参考OSI各个分层的作用各层次的功能简介 TCP/…...

Stream流性能分析及优雅使用

文章目录 摘要一、Stream原理解析1.1、Stream总概1.2、Stream运行机制1.2.1、创建结点1.2.1、搭建流水线1.2.3、启动流水线 1.3、ParallelStream 二、性能对比三、优雅使用3.1 Collectors.toMap()3.2 findFirst()&#xff0c;findAny()3.3 增删元素3.4 ParallelStream 四、总结…...