C++ const、constexpr与consteval作用与区别
C++ const、constexpr与consteval作用与区别
在C++ 常量表达式和编译时优化中,我们已经提到了常量、编译时常量与运行时常量的概念。为了加深理解,我们再重新明晰一下这三者的概念。
-
常量:初始化之后便不可修改的量。在c++中使用const修饰的“变量”称为常量。const修饰的常量可以是编译时常量,也可以是运行时常量。现代编译器将自行推理决断。
#include<iostream> int main(){const int x{1};std::cout << x << std::endl;//可以读取x = 5; //error,编译错误,常量不可修改 }
-
编译时常量:在编译时,编译器将常量的值计算出来,不必等到每次运行时计算。
#include<iostream> int main(){const int x{1 + 8};std::cout << x << std::endl; }
就像上面的代码,若不优化,则每次运行编译后的程序时都需要计算 1 + 8 1+8 1+8,如果程序执行一百万次,则 1 + 8 1+8 1+8将被计算一百万次。这完全是没有必要的。
优化后的结果类似以下代码:#include<iostream> int main(){const int x{9};std::cout << x << std::endl; }
-
运行时常量:程序运行时才确定下来的常量。
#include<iostream> int main(){int a = 9;const int x{a}; //由于a是一个变量,所以x只能在运行到此处的时候才能确定值。std::cout << x << std::endl; }
constexpr
尽管现代编译器已经可以自主判断是否应该编译时优化,但是由于某些表达式十分复杂,仅仅依赖于编译器是十分困难的。于是c++提供了constexpr关键字,它告诉编译器其修饰的常量是编译时常量可以在编译时优化。
注意: constexpr
表示该对象可以在常量表达式中使用。初始值设定项的值在编译时必须已知。constexpr
对象可以在运行时或编译时进行计算。constexpr
与std::string、std::vector和其他使用动态内存分配的类型不完全兼容。
#include <iostream>double nonconstexpr_ex(double radius)
{constexpr double pi { 3.14159265359 };return 2.0 * pi * radius;
}
constexpr double constexpr_ex(double radius)
{constexpr double pi { 3.14159265359 };return 2.0 * pi * radius;
}
int main()
{constexpr double circumference { nonconstexpr_ex(3.0) }; // 编译错误constexpr double circumference { constexpr_ex(3.0) }; // 正确std::cout << "Our circle has circumference " << circumference << "\n";return 0;
}
注:
constexpr
函数也可以在运行时进行计算。所以在非必要时,编译器可自行选择函数是否在编译时计算。constexpr
函数是隐式内联的, 编译器必须能够看到constexpr
(或consteval
)函数的完整定义,而不仅仅是前向声明。
consteval
consteval
是c++20引入的关键字。用于指示函数必须在编译时计算,否则将导致编译错误。此类函数称为即时函数(immediate functions)。
相关文章:

C++ const、constexpr与consteval作用与区别
C const、constexpr与consteval作用与区别 在C 常量表达式和编译时优化中,我们已经提到了常量、编译时常量与运行时常量的概念。为了加深理解,我们再重新明晰一下这三者的概念。 常量:初始化之后便不可修改的量。在c中使用const修饰的“变量”…...
solidity 数学和密码学函数
数学和密码学函数为开发者提供了一系列强大的工具,用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k,加法会在任意精度下执行,并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…...

opencv-图像透视变换
透射变换是视角变化的结果,是指利用透视中心,像点,目标点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度,破坏原有的投影光束,仍能保持承影面上投影几何图形不变的变化) 它的本质将图…...
C++ 域
C 域 :: C中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了…...

安装Supervisor队列进程、管理 Laravel 队列进程
在 CentOS 上安装 Supervisor 并配置 Laravel 的步骤如下: 1.安装 Supervisor: 使用以下命令安装 Supervisor: sudo yum install epel-release sudo yum install supervisor 2.配置 Supervisor: 创建一个新的 Supervisor 配置文…...

Windows入侵排查秘籍:锁死安全漏洞
文章目录 Windows入侵排查秘籍:锁死安全漏洞1 检查系统账号安全1.1 查看服务器是否有弱口令,远程管理端口是否对公网开放1.2 查看服务器是否存在可疑账号、新增账号1.3 结合日志,查看管理员登录时间、用户名是否存在异常 2 检查异常端口、进程…...
根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()
根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()查看试题完整内容答案 A、大数据B、人工智能 C、数字技术D、科学技术 根据《广州市支…...

git的基本操作和原理
基本操作 原理 Git是分布式版本控制系统,可以保存每次修改后的代码,方便我们随时返回。 根据用户所写的代码,自动生成commit号,这个版本号只与代码内容有关,只要代码内容不同,commit id 就不同。 使用哈希…...

Unity补完计划 之 SpriteRender
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.SpriteRenderer是什么 渲染精灵用的,是渲染的核心组件,有许多重要参数所以要详细讲一讲 Spri…...

数据结构第九讲:二叉树
数据结构第九讲:二叉树 1.实现链式结构二叉树1.1二叉树的节点结构1.2创建二叉树节点1.3前中后序遍历1.3.1前序遍历1.3.2中序遍历1.3.3后序遍历1.3.4总结 1.4二叉树结点的个数1.4.1错误示范1.4.2实现方法 1.5二叉树叶子结点的个数1.6二叉树第k层结点的个数1.7二叉树的…...

英伟达推出B200A瞄准OEM客群,预估2025年高端GPU出货量年增55%
市场近日传出NVIDIA(英伟达)取消B100并转为B200A,据TrendForce集邦咨询了解,NVIDIA仍计划在2024年下半年推出B100及B200,供应CSPs(云端服务业者)客户,并另外规划降规版B200A给其他企…...
Codeforces Round 962 (Div. 3)-补题
A. Legs 二分答案,最后取左端点的值,保险起见,还是再验算一次 bool check(int x){int an/4;if(a*4(x-a)*2>n) return true;return false; }void solve(){cin>>n;int l0,rn;while(l1<r){int midlr>>1;if(check(mid)) rmid…...
pandas的文本与序列化
文章目录 1.pandas的文本与序列化 result_data pd.DataFrame(json_data_list)with open(jsonl_file_path, w, encodingutf-8) as jsonl_file:result_data.to_json(orientrecords, linesTrue, force_asciiFalse, path_or_bufjsonl_file)数据不换行 df.at[i, column_name_transc…...
在企业级环境中部署Java程序:Docker命令实用指南
在企业级环境中部署Java程序:Docker命令实用指南 引言 在企业级开发中,Java应用程序的部署往往需要考虑效率、安全性和可移植性。Docker作为一个流行的容器化平台,提供了一种简便、一致且可移植的方式来部署Java应用。以下是一些常用的Dock…...

LabVIEW远程开发
LabVIEW远程开发是指在不同地点的开发者通过网络协同工作,共同开发、调试和维护基于LabVIEW的应用程序。这种开发模式适用于分布式团队、远程办公和全球化项目合作,能够有效利用不同地区的人才和资源。以下是LabVIEW远程开发的详细介绍: 1. 远…...

工作随记:我在OL8.8部署oracle rac遇到的问题
文章目录 一、安装篇问题1:[INS-08101] Unexpected error while executing the action at state:supportedosCheck问题1解决办法:问题2:[INS-06003] Failed to setup passwordless SSH connectivity with thefollowing nodeis): [xxxx1, xxxx…...

C++:vector容器
概览 std::vector是C标准模板库(STL)中的一种动态数组容器。它提供了一种类似于数组的数据结构,但是具有动态大小和更安全的内存管理。 定义和基本特性 std::vector是C标准库中的一 个序列容器,它代表了能够动态改变大小的数组。与普通数组一样&#x…...
深入理解 AWS CodePipeline
AWS CodePipeline 是一种持续交付和持续集成(CI/CD)服务,用于自动化软件发布过程。它通过创建流水线来帮助你自动构建、测试和部署应用程序。以下是对 AWS CodePipeline 的深入理解,包括其工作原理、组件、功能和使用场景: 1. AWS CodePipeline 的基本概念 持续集成和持续…...

Qt:自定义钟表组件
使用QWidget绘制两种钟表组件,效果如下: 源码下载链接:GitHub - DengYong1988/Clock-Widget: Qt 自定义钟表组件 https://download.csdn.net/download/ouyangxiaozi/89616407 主要代码如下: ClockWgt.h #ifndef CLOCKWGT_H #d…...
前端性能优化-web资源加载优先级
前言 资源加载优先级是指在页面渲染的过程中,浏览器决定加载哪些资源并优先加载它们的一种机制。正确配置资源加载的优先级可以显著改善页面加载性能,确保关键资源优先加载,提高用户感知的加载速度。 Web 资源加载方式 同步加载 同步加载…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...