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

news2024/11/15 9:41:51

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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源Spring Boot版本WebSSH:轻松在浏览器中管理SSH和FTP

介绍 WebSSH 是一个轻量级的开源ssh工具&#xff0c;只需安装在服务端&#xff0c;就可以通过浏览器访问SSH和FTP。它支持文件和日志高亮显示&#xff0c;Vim 和 Top 命令&#xff0c;实时查看日志&#xff0c;并且操作体验与标准的 Shell 基本相同。WebSSH 支持多会话、文件上…

“艺启创作 智绘未来”AI漫画创意大赛,燃动国漫新纪元!

8月2日&#xff0c;百度文库宣布携手玄机科技举办国内首个「AI漫画大赛」&#xff0c;用户可以直接尝试用AI创作漫画&#xff0c;并在未来为用户独家提供AI小说、AI漫画分镜等行业领先的跨模态AI创作能力。 跨界融合&#xff0c;创新无限 本次大赛&#xff0c;不仅是创意的碰撞…

深度学习 —— 个人学习笔记9(图像卷积、填充和步幅及多输入多输出通道)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 十九、图像卷积 import torch from torch import nndevice torch.device("cuda:0" if torch.cuda.is_ava…

【Stable Diffusion】(基础篇八)—— 局部重绘

局部重绘 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 我们使用SD生成一张整…

【Vulnhub系列】Vulnhub Noob 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub Noob靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 有一个go.php的form表单接收文件 这里识别21端口存在未授权&#xff0c;55077 是ssh 的服务…

计算机网络学习:TCP握手挥手强制连接中断

之前系统学习过TCP协议&#xff0c;但很多地方并不是特别清晰&#xff0c;今天结合抓包情况&#xff0c;再拾一下拾一下>.< 首先看一下TCP数据包的标志位&#xff1a; SYN&#xff1a;简写为S&#xff0c;同步标志位&#xff0c;用于建立会话连接&#xff0c;同步序列号…

ubuntu20.4 微信的安装

一、背景 ubuntu作为常用系统了&#xff0c;微信少不了&#xff0c;但官方没有微信的linux版本 appImage类似于windows下免安装版本。 二、方法 1、下载appImage格式的开源微信版本 https://github.com/zydou/WeChat-AppImage/releases 2、改文件改属性 为什么使用ubuntu 作…

计算机技术基础 (bat 批处理)Note5

计算机技术基础 &#xff08;bat 批处理&#xff09;Note5 本节主要讲解 FOR 命令语句&#xff08;循环&#xff09;在 bat 批处理中的使用 (part 1) FOR 命令语句 在批处理中&#xff0c;for 是最为强大的命令语句&#xff0c;它的出现&#xff0c;使得解析文本内容、遍历文…

Python数值计算(18)——三次样条曲线概述

1. 概述 前面介绍到了多种插值方法&#xff0c;但是这些插值方法都无法避免龙格现象&#xff0c;即高阶多项式可能存在剧烈的振动&#xff0c;而且在区间的一个点处的微小扰动&#xff0c;都可能引起整个范围内的巨大振动&#xff0c;一种替代方式是使用类似线性插值的方式&am…

Python进阶 JSON数据,pyecharts制图

目录 json数据格式的转换 什么是json json本质 注意 pyecharts快速入门 画一个最简单的折线图 使用全局配置选项优化折线图 总结 json数据格式的转换 什么是json 一种轻量级的数据交换格式&#xff0c;可以按json指定的格式去组织和封装数据 json本质 带有特定格式的…

OpenSPG安装部署

文章目录 前言一、安装前准备安装docker安装docker compose 二、安装服务端下载 docker-compose.yml 文件启动服务端 三、安装客户端拉取镜像克隆OpenSPG源码 案例 前言 OpenSPG是以SPG框架为基础设计和实现的知识图谱开放引擎&#xff0c;它为领域图谱构建提供了明确的语义表…

数据结构1绪论

一、数据结构的绪论的思维导图 二、数据 1.数据是描述客观存在事务的符号&#xff0c;其能被计算机识别&#xff0c;处理。 数据不仅仅是整型&#xff0c;实型等数值类型&#xff0c;还包括声音&#xff0c;视频&#xff0c;图像等。 三、数据元素 1.数据元素是组成数据的有…

PTA—基础编程题目集(7-20)

7-20 打印九九口诀表 目录 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 参考代码 总结 题目描述 下面是一个完整的下三角九九口诀表&#xff1a; 1*11 1*22 2*24 1*33 2*36 3*39 1*44 2*48 …

js基础-作用域与作用域链

什么是作用域&#xff1f; 简单说就是在代码中定义的变量或者函数能起作用的范围 什么是作用域链&#xff1f; 简单说就是JavaScript 在执行时查找变量的过程&#xff0c;它按照从当前作用域到全局作用域的顺序逐层向上搜索&#xff0c;直到找到变量或到达作用域的顶…

C#进阶-轻量级ORM框架Dapper的使用教程与原理详解

本文详细介绍了Dapper在C#中的使用方法&#xff0c;包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用&#xff0c;并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐&#xff0c;适用于各种数据库操作需…

基于环形拓扑的多目标粒子群优化算法(MO_Ring_PSO_SCD)求解无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节&#xff0c;无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

怎么智能化管理公司众多电脑?公司电脑太多怎么管控!智慧运维,精准管控的它来啦!

俗语称&#xff1a;“团结则强&#xff0c;分散则弱&#xff1b;集腋成裘&#xff0c;聚沙成塔。” 面对公司里如繁星般的电脑大军&#xff0c;你是否曾感到管理无力&#xff0c;仿佛在与一群“不羁的野马”较劲&#xff1f;别担心&#xff0c;智慧运维的浪潮已经席卷而来&…

Mybatis学习(3)

目录 一、JDBC vs Mybatis 二、Mybatis Plugin 三、Dao接口和xml文件的sql如何建立关联 四、Mybatis如何将sql执行结果封装为目标对象并返回的&#xff1f;都有哪些映射形式&#xff1f; 五、动态SQL 六、一级缓存和二级缓存 七、接口绑定的实现 八、Mybatis vs Hiberna…

Mybatis的注解开发学习笔记

学习视频:5001 Select注解_哔哩哔哩_bilibili~5009 案例&#xff1a;基于MyBatis注解的学生管理程序_哔哩哔哩_bilibili 目录 1.基于注解的单表增删改查 1.1Select注解 1.2Insert注解 1.3Update注解 1.4Delete注解 1.5Param注解 2.基于注解的关联查询 2.1一对一查询 2.2…

[Meachines] [Easy] nibbles Nibbleblog-Upload

信息收集 IP AddressOpening Ports10.10.10.75TCP:22,80 $ nmap -p- 10.10.10.75 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 c4:f8:ad:e8:f8:04:…