C++ 语言特性17 - constexpr

news2024/10/4 17:32:01

一:概述

        constexpr 是 C++11 引入的关键字,用于在编译时评估表达式并生成常量值。这可以提高性能和代码的可读性,减少运行时计算。

二:举例

        1. 编译时常量表达式

  constexpr的主要用途是确保某些表达式在编译时计算。例如,数学计算、常量初始化等场景下,可以用constexpr代替const来强制在编译时执行计算

constexpr int square(int x) {
    return x * x;
}

constexpr int result = square(5);  // 编译时计算 result 的值为 25

        2. 常量成员函数

       当类的某些成员函数可以在编译时计算时,可以将其声明为constexpr。在这样的函数中,只要输入是编译时常量,返回值也会在编译时确定。

struct Point {
    int x, y;
    constexpr Point(int xVal, int yVal) : x(xVal), y(yVal) {}
    constexpr int getX() const { return x; }
    constexpr int getY() const { return y; }
};
constexpr Point p(1, 2);
constexpr int x = p.getX();  // 在编译时计算

       3. 如果需要在编译时确定数组的大小,可以使用constexpr来计算数组的大小。

constexpr int getSize() {
    return 10;
}
int arr[getSize()];  // 数组大小在编译时确定

        4. constexpr函数支持递归

        这使得复杂的计算也可以在编译时完成。注意,递归的深度不能超出编译器的限制。

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}
constexpr int result = factorial(5);  // 编译时计算 result 为 120

三: 注意事项

 1. 函数体限制

        在 C++11 中,constexpr函数的函数体必须是单一的 return 语句,C++14 以后可以包含更多复杂的语句,比如条件判断、循环等。下面是 C++11 和 C++14 对函数体的不同要求:

// C++11 constexpr 函数(单个return语句)
constexpr int add(int a, int b) {
    return a + b;
}

// C++14 constexpr 函数(可以包含条件判断)
constexpr int max(int a, int b) {
    if (a > b) return a;
    else return b;
}

2. 局限性

 constexpr函数不能包含运行时只能执行的操作,例如:

  • 不能抛出异常
  • 不能使用 new 或动态内存分配
  • 不能有运行时依赖的函数调用

3. 编译时和运行时调用

   constexpr函数可以在编译时和运行时调用。如果参数是常量表达式,编译器会在编译时计算结果;如果参数不是常量表达式,函数会在运行时执行.

constexpr int sum(int a, int b) {
    return a + b;
}
int x = 5;
int result1 = sum(3, 4);  // 编译时计算
int result2 = sum(x, 4);  // 运行时计算

4. 构造函数中的constexpr

         从C++11开始,类的构造函数可以声明为constexpr。这意味着可以使用constexpr构造常量对象,前提是所有成员变量的初始化也是常量表达式。

5. constexpr vs const

  • constexpr 确保编译时计算,而 const 表示常量但不保证编译时计算。
  • const对象可以在运行时初始化,而constexpr对象必须在编译时初始化。

 

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

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

相关文章

5G NR coreset 简介

文章目录 5G 为何引入CORESETCORESET介绍CORESET 分类 5G 为何引入CORESET 在LTE系统中&#xff0c;PDCCH频域占据整个带宽&#xff0c;始于占据每个RB的前1~3个OFDM 符号&#xff0c;这种情况下&#xff0c;UE 只需知道PDCCH 所占据的OFDM 符号数&#xff0c;就可以确定PDCCH…

内存对齐

内存对齐的基本规则是&#xff1a;只能在自己所占字节的整数倍的内存地址上存放&#xff08;结构体也是如此&#xff09;。 假如定义一下变量&#xff1a; 对应的存储格式为&#xff1a; 由于变量C占四个字节&#xff0c;所以从12开始。 对于整个结构体而言&#xff1a;结构体…

【Web】portswigger 服务端原型污染 labs 全解

目录 服务端原型污染 为什么服务器端原型污染更难检测&#xff1f; 通过受污染的属性反射检测服务器端原型污染 lab1:通过服务器端原型污染进行权限提升 无需污染属性反射即可检测服务器端原型污染 状态代码覆盖 JSON 空格覆盖 字符集覆盖 lab2:检测没有污染属性反射的…

Pikachu-xss防范措施 - href输出 js输出

总体原则&#xff1a; 输入做过滤&#xff0c;输出做转义 过滤&#xff1a;根据业务需要进行过滤&#xff0c;如&#xff1a;输入点要求输入手机号&#xff0c;则只允许输入手机号格式的数字&#xff1b; 转义&#xff1a;所有输出到前端的数据&#xff0c;都根据输出点进行转…

银河麒麟V10如何快速进入单用户模式?

银河麒麟V10如何快速进入单用户模式&#xff1f; 1. 进入GRUB菜单2. 编辑启动项3. 登录系统4. 修改启动参数5. 退出单用户模式 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 银河麒麟高级服务器操作系统V10在系统维护或故障排查时&#xf…

70.【C语言】动态内存管理(重点)(3)

承接69.【C语言】动态内存管理(重点)(2)文章 目录 4.calloc函数 cplusplus网的翻译 提炼要点 使用 5.recalloc函数 使用说明 作用 调整内存空间的几种情况 1.原有空间之后有足够大的空间 2.原有空间之后没有足够大的空间 建议 代码 用recalloc函数来实现malloc函…

学习C语言(22)

整理今天的学习内容 1.常见的动态内存的错误 &#xff08;1&#xff09;对NULL指针进行解引用操作 &#xff08;2&#xff09;对动态开辟空间的越界访问 &#xff08;3&#xff09;对非动态开辟内存使用free释放 &#xff08;4&#xff09;使用free释放一块动态开辟内存的一部…

抖音巨量千川涨粉操作流程,值得学习

抖音巨量千川涨粉操作流程值得学习:rjxbb0616 1、找到抖音合作码&#xff08;在抖音APP里&#xff1a;我-右上角三条杠-设置-账号与安全-我的合作码&#xff09;复制合作码发给合作商。 2、合作商在千川平台上发布一个虚拟的热门作品到抖音&#xff0c;然后在千川账户建立目标账…

mysql连接池

MySQL连接池 什么是数据库连接池&#xff1f; ​ 定义&#xff1a;数据库连接池&#xff08;Connection pooling&#xff09;是程序启动时建立一定数量的数据库连接&#xff0c;并将这些连接组成 一个连接池&#xff0c;由程序动态地对池中的连接进行申请&#xff0c;使用&am…

HTML:相关概念以及标签

目录 什么是网页? 什么是HTML语言? 语法规范 HTML基本结构标签 DOCTYPE,lang以及字符集 HTML常用标签 5>图像标签(重要) 除此之外还有几个调整图片属性的标签 图像标签总结 什么是网页? 我们平时使用电脑和手机都是离不开网站和网页的,那么什么是网页呢?什么又是网…

Yolov8改进轻量级网络Ghostnetv2

1,理论部分 轻量级卷积神经网络 (CNN) 专为移动设备上的应用程序而设计,具有更快的推理速度。卷积运算只能捕获窗口区域中的局部信息,这会阻止性能进一步提高。将自我注意引入卷积可以很好地捕获全局信息,但会在很大程度上阻碍实际速度。在本文中,我们提出了一种硬件友好…

【技术分析】嘉楠科技SoC芯片K230

概述 K230是嘉楠科技Kendryte系列AIoT芯片中的最新一代SoC芯片&#xff0c;该芯片采用全新的多异构单元加速计算架构&#xff0c;集成的玄铁C908具有2个高能效RISCV计算核心&#xff0c;内置新一代KPU&#xff08;Knowledge Process Unit&#xff09;智能计算单元&#xff0c;…

【cpp/c++ summary 工具】 Hunter 报错 CMake hunter error: Unexpected MSVC_VERSION

原因&#xff1a;使用的MSVC编译器版本较高&#xff0c;而Hunter版本较低&#xff0c;可在https://github.com/cpp-pm/hunter/releases配置高版本Hunter # HunterGate( # URL "https://github.com/cpp-pm/hunter/archive/v0.23.297.tar.gz" # SHA1 "33…

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:

使用git clone 时报错unable to access xxx: SSL certificate problem: 这个报错通常是由于SSL证书问题引起的。通常可以按照以下步骤进行排查&#xff1a; 检查网络连接&#xff1a;确保你的网络连接正常&#xff0c;可以访问互联网。尝试使用其他网站或工具测试网络连接是否正…

netty之Netty集群部署实现跨服务端通信的落地方案

前言 在一些小型用户体量的socket服务内&#xff0c;仅部署单台机器就可以满足业务需求。但当遇到一些中大型用户体量的服务时&#xff0c;就需要考虑讲Netty按照集群方式部署&#xff0c;以更好的满足业务诉求。但Netty部署集群后都会遇到跨服务端怎么通信&#xff0c;也就是有…

【PS】删除自定义形状,添加自定义形状

删除自定义形状 在这里选择删除形状为灰色的时候&#xff0c;是不能直接删除的&#xff0c;需要打开形状窗口后才能删除。 找到形状窗口&#xff0c;打开它 然后就可以删除形状了。 导入形状 右键&#xff0c;导入形状 选择你要导入的形状包&#xff08;我这个是某宝买…

Stable Diffusion绘画 | 来训练属于自己的模型:秋叶训练器使用

花了不少时间搜索尝试&#xff0c;都没有找到解决上一篇文章遗留问题的解决方案&#xff0c;导致无法使用 cybertronfurnace 这个工具来完成炼丹&#xff0c;看不到炼丹效果。 但考虑到&#xff0c;以后还是要训练自己的模型&#xff0c; 于是决定放弃 cybertronfurnace&…

数据结构与算法——Java实现 28.二叉树的锯齿形层序遍历

努力成为你想要成为的那种人&#xff0c;去奔赴你想要的生活 —— 24.10.4 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候&#xff0c;需要绘制场景网格的功能&#xff0c;于是就用到了UnityEngine.GL这个图形库来绘制&#xff0c;然后我发现绘制的网格线是渲染在UI之后的&#xff0c;也就是说绘制出来的图形会遮盖在UI上面&#xff0c;也就导致一旦这些…

第十八章(数据在内存中的储存)

1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 我本将心向明月&#xff0c;奈何明月照沟渠正文开始 一、.整数在内存中的储存 整数的2进制的表示方法有三种 1.原码 2.反码 3.补码 这里在第十章我们有详细讲解&#xff0c;有需要的同学可以自…