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

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对象可以在运行时或编译时进行计算。constexprstd::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;
}

  1. constexpr 函数也可以在运行时进行计算。所以在非必要时,编译器可自行选择函数是否在编译时计算。
  2. constexpr 函数是隐式内联的, 编译器必须能够看到constexpr(或 consteval)函数的完整定义,而不仅仅是前向声明。

consteval

constevalc++20引入的关键字。用于指示函数必须在编译时计算,否则将导致编译错误。此类函数称为即时函数(immediate functions)。

相关文章:

C++ const、constexpr与consteval作用与区别

C const、constexpr与consteval作用与区别 在C 常量表达式和编译时优化中&#xff0c;我们已经提到了常量、编译时常量与运行时常量的概念。为了加深理解&#xff0c;我们再重新明晰一下这三者的概念。 常量&#xff1a;初始化之后便不可修改的量。在c中使用const修饰的“变量”…...

solidity 数学和密码学函数

数学和密码学函数为开发者提供了一系列强大的工具&#xff0c;用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k&#xff0c;加法会在任意精度下执行&#xff0c;并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…...

opencv-图像透视变换

透射变换是视角变化的结果&#xff0c;是指利用透视中心&#xff0c;像点&#xff0c;目标点共线的条件&#xff0c;按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度&#xff0c;破坏原有的投影光束&#xff0c;仍能保持承影面上投影几何图形不变的变化) 它的本质将图…...

C++ 域

C 域 :: ​ C中域有函数局部域&#xff0c;全局域&#xff0c;命名空间域&#xff0c;类域&#xff1b;域影响的是编译时语法查找一个变量/函数/类型出处&#xff08;声明或定义&#xff09;的逻辑&#xff0c;所以有了域隔离&#xff0c;名字冲突就解决了。局部域和全局域除了…...

安装Supervisor队列进程、管理 Laravel 队列进程

在 CentOS 上安装 Supervisor 并配置 Laravel 的步骤如下&#xff1a; 1.安装 Supervisor&#xff1a; 使用以下命令安装 Supervisor&#xff1a; sudo yum install epel-release sudo yum install supervisor 2.配置 Supervisor&#xff1a; 创建一个新的 Supervisor 配置文…...

Windows入侵排查秘籍:锁死安全漏洞

文章目录 Windows入侵排查秘籍&#xff1a;锁死安全漏洞1 检查系统账号安全1.1 查看服务器是否有弱口令&#xff0c;远程管理端口是否对公网开放1.2 查看服务器是否存在可疑账号、新增账号1.3 结合日志&#xff0c;查看管理员登录时间、用户名是否存在异常 2 检查异常端口、进程…...

根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()

根据《广东省政务服务数字化条例》规定&#xff0c;政务服务数字化&#xff0c;是指将___广泛应用于政务服务&#xff0c;推动政务服务更加智能、便捷、高效的活动。&#xff08;&#xff09;查看试题完整内容答案 A、大数据B、人工智能 C、数字技术D、科学技术 根据《广州市支…...

git的基本操作和原理

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

Unity补完计划 之 SpriteRender

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

数据结构第九讲:二叉树

数据结构第九讲&#xff1a;二叉树 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&#xff08;英伟达&#xff09;取消B100并转为B200A&#xff0c;据TrendForce集邦咨询了解&#xff0c;NVIDIA仍计划在2024年下半年推出B100及B200&#xff0c;供应CSPs&#xff08;云端服务业者&#xff09;客户&#xff0c;并另外规划降规版B200A给其他企…...

Codeforces Round 962 (Div. 3)-补题

A. Legs 二分答案&#xff0c;最后取左端点的值&#xff0c;保险起见&#xff0c;还是再验算一次 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程序&#xff1a;Docker命令实用指南 引言 在企业级开发中&#xff0c;Java应用程序的部署往往需要考虑效率、安全性和可移植性。Docker作为一个流行的容器化平台&#xff0c;提供了一种简便、一致且可移植的方式来部署Java应用。以下是一些常用的Dock…...

LabVIEW远程开发

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

工作随记:我在OL8.8部署oracle rac遇到的问题

文章目录 一、安装篇问题1&#xff1a;[INS-08101] Unexpected error while executing the action at state:supportedosCheck问题1解决办法&#xff1a;问题2&#xff1a;[INS-06003] Failed to setup passwordless SSH connectivity with thefollowing nodeis): [xxxx1, xxxx…...

C++:vector容器

概览 std::vector是C标准模板库(STL)中的一种动态数组容器。它提供了一种类似于数组的数据结构&#xff0c;但是具有动态大小和更安全的内存管理。 定义和基本特性 std::vector是C标准库中的一 个序列容器&#xff0c;它代表了能够动态改变大小的数组。与普通数组一样&#x…...

深入理解 AWS CodePipeline

AWS CodePipeline 是一种持续交付和持续集成(CI/CD)服务,用于自动化软件发布过程。它通过创建流水线来帮助你自动构建、测试和部署应用程序。以下是对 AWS CodePipeline 的深入理解,包括其工作原理、组件、功能和使用场景: 1. AWS CodePipeline 的基本概念 持续集成和持续…...

Qt:自定义钟表组件

使用QWidget绘制两种钟表组件&#xff0c;效果如下&#xff1a; 源码下载链接&#xff1a;GitHub - DengYong1988/Clock-Widget: Qt 自定义钟表组件 https://download.csdn.net/download/ouyangxiaozi/89616407 主要代码如下&#xff1a; ClockWgt.h #ifndef CLOCKWGT_H #d…...

前端性能优化-web资源加载优先级

前言 资源加载优先级是指在页面渲染的过程中&#xff0c;浏览器决定加载哪些资源并优先加载它们的一种机制。正确配置资源加载的优先级可以显著改善页面加载性能&#xff0c;确保关键资源优先加载&#xff0c;提高用户感知的加载速度。 Web 资源加载方式 同步加载 同步加载…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...