C++:常量表达式

C++11开始constexpr作为一种声明,为编译器提供了在编译期间确认结果的优化建议,满足部分编译期特性的需求

constexpr和const区别

int b=10;
const int a=b;
//运行成功
constexpr int c=b;
//编译器报错,b的值在编译期间不能确定
const int size1(){return 100;}
constexpr int size2(){return 100;}
char buf1[size1()];//报错
char buf2[size2()];//通过

constexpr修饰的变量它的值必须在编译阶段可以确认,const只是作为常类型。

对constexpr修饰的函数的约束(C++11)

  • 函数必须有一个返回值即返回值类型不能是void
  • 函数体内只能有一行用于输出返回值且返回值必须是常量表达式
  • 函数必须定义且必须用constexpr声明

注意:即使定义了一个常量表达式函数,如果形参不是常量表达式的话函数会退化为普通函数

字面类型(常量表达式中所有类型必须是字面类型)

  • 构造函数用constexpr声明
  • 构造函数初始化参数列表里是常量表达式
  • 构造函数的函数体为空
  • 基本数据类型、指针、引用、各种字面量都是字面类型

C++ 14标准规则:

  • 函数体允许声明初始化过的变量,除了static和thread_local变量
  • constexpr不在具有const属性
  • 开始支持部分代码如:if,switch,各种循环
  • 可以修改字面类型数据
  • 返回值可以是void了

C++17开始lamada表达式可以用constexpr声明时会进行隐式声明

char *buf[[](){return 1024;};];

C++17 提出了if constexpr,它可以根据一个常量表达式的返回结果有选择的编译部分代码,可以简化模板的编写,比如:特化的实现

template <typename T>
void printSize(T value) {if constexpr (std::is_integral<T>::value) {std::cout << "Size of integral type: " << sizeof(T) << " bytes" << std::endl;} else if constexpr (std::is_floating_point<T>::value) {std::cout << "Size of floating-point type: " << sizeof(T) << " bytes" << std::endl;} else {std::cout << "Size of other type: " << sizeof(T) << " bytes" << std::endl;}
}

C++20 标准

  • 支持constexpr虚函数
  • 运行在constexpr中进行一些默认初始化
  • 支持try catch和typeid,dynamic_cast等运算符的使用

constexpr相关关键字

  • consteval关键字,强制编译期出结果,得不到结果程序结束(C++ 20)
  • constinit关键字,用于具有静态存储持续时间的(生命周期全局)变量声明上,他要求变量具有常量初始化程序(编译阶段初始化),某种程度上可以提高程序效率

应用:
封装static_assert的参数,STL中sort源码中快排部分判断比较器是否有效时,将比较对象的顺序调换看比较结果是否是否不同,所以使用sort时比较器必须是常量表达式函数
在这里插入图片描述

STL中sort的源码中插入排序部分就用到了常量表达式用于判断迭代器的种类,如果是线性迭代器使用memmove直接移动数据,否则就需要使用循环一个一个的移动对象,这里不详细的说明了,有时间的化会写一篇博客讲一下sort源码
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电视盒子什么牌子好?老烧分享电视盒子品牌排行榜

多年前开始我就用电视盒子了至今已经七年&#xff0c;对各个品牌的电视盒子我都有详细深入的了解&#xff0c;看到网友们在讨论电视盒子什么牌子好&#xff0c;不知道如何挑选电视盒子的朋友们可以关注发烧友圈公认的电视盒子品牌排行榜&#xff0c;看看入围的都有哪些品牌吧。…

数据库之MVCC

1、什么是MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。MVCC使得大部分支持行锁的事务引擎&#xff0c;不再单纯的使用行锁来进行…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录 1 前言2 串口打印库函数版本3 串口打印寄存器版本3.1 配置时钟3.2 配置GPIO功能3.3 配置CR2寄存器3.4 配置CR1寄存器3.5 配置CR3寄存器 1 前言 我们在调试的过程中&#xff0c;都比较喜欢直观的数据&#xff0c;这时候我们可以使用芯片的串口功能&#xff0c;把数据打…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章&#xff0c;小编将深入为大家讲解开发智能扫码点餐系统的技术细节&#xff0c;从系统架构到关键功能实现&#xff0c;为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作&#xff0c;大大简化了点餐流程&#xff0c;提升了…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1&#xff09;可以在不改动原有对象代码的情况下扩展对象的功能&#xff0c;通过聚合的方式相较于继承更加灵活。 2&#xff09;UML图 2.示例 汽车有很多装饰可选&#xff0c;如座椅、音响、轮胎等都可以进行自定义组装 1&#xff09;抽象汽车对象 public interfac…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式&#xff0c;虽然它可能看起来有些复杂&#xff0c;但是一旦掌握了基本命令&#xff0c;你…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中&#xff0c;年份选择是一个常见的需求。无论是在日历应用程序中查看事件&#xff0c;还是在历史类游戏中选择时间段&#xff0c;年份选择器都是用户体验的重要组成部分&#xff0c;下面实现一个简易的年份选择器。 一、效果预览&#xff1a; 目录 一、…

为什么会出现 targetId 与 senderUserId 相同的情况?

描述 单聊会话&#xff08;两位用户聊天&#xff09;中出现了消息的 targetId 和 senderUserId 相同的情况。 分析 融云 IM 设计如此。 senderUserId 是消息的发送者的用户 ID。targetId 是当前会话的 ID&#xff0c;该 ID 指向与本端用户对话的用户 ID、群组 ID、聊天室 I…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构&#xff0c;相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics&#xff0c;又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步&#xff1a;下载log4net。 右键项目引用&#xff0c;进入管理NuGet包。 搜索log4net&#xff0c;下载安装。 第二步&#xff1a;创建LogHelper类。 public class LogHelper { private LogHelp…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础&#xff0c;同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式&#xff0c;其基本思想都是类似的&#xff1a;当点击事件传到 View 时&#xff0c;系统记下触摸点的坐标&#xff0c;手指移动时系统记下移动后…