C++中的const, constexpr, consteval, constinit 汇总

C++ const与constexpr深度解析:从常量定义到编译期计算 在C++编程中,常量定义和编译期计算是提升代码质量和性能的核心技术。const关键字通过类型限定符实现对变量、指针和成员函数的只读约束,确保程序逻辑的不变性,这是编写安全、可维护代码的基础。constexpr则进一步要求表达式或对象在编译时即可确定值,将计算从运行时转移到编译期,从而消除运行时开销,实现零开销抽象。这种编译期计算能力对于性能优化、模板元编程和库开发至关重要,特别是在需要固定数组大小、模板非类型参数等场景中。通过深入理解const的承诺不变性和constexpr的编译期确定性要求,开发者能够更 阅读详情


前言

const constexpr 还有consteval constinit, 他们到底有什么区别和联系?


提示:以下是本篇文章正文内容,下面案例可供参考

一、const

  • const是变量类型名的一部分,即 part of type name,一个名字叫“const T”的类型,和T这个类型本身处于一种平级的关系
  • 既然const T只是一个类型,那么以它为类型的变量就既可以在编译期间初始化,也可以在运行期间初始化。

二、constexpr

  • constexpr是声明的一部分,即 part of a declaration,他不是变量类型的一部分。
  • constexpr的主要作用是声明变量的值或函数的返回值可以在常量表达式(即编译期便可计算出值的表达式)中使用,没有constexpr函数之前,我们无法在需要编译期常量的地方使用函数的返回值。
  • 当引用变量用constexpr修饰时,这个引用变量所指向的object必须也在编译期获得明确的初始化,即初始化涉及到的所有运算都必须是可以在编译期间完成的。
  • 假如我们想用某个构造函数来给constexpr变量赋值时,这个构造函数就必须用constexpr修饰。
  • constexpr修饰函数时对函数的要求:
    • 除了函数自己的参数, 函数只能引用全局不变常量 。

    • 函数只能调用其他 constexpr 修饰的函数。

    • 如果你想要函数调用表达式的返回值能作为编译期常量使用, 首先实参必须是编译时能确定值的常量. 而不管函数是否用到该实参,就算返回值确实是一个字面量

      #include <iostream>
      #include <array>
      using namespace std;
      
      constexpr int foo(int i)
      {
          return  5;
      }
      
      int main()
      {
          int i = 10;
          std::array<int, foo(5)> arr; // OK
          foo(i); // Call is Ok
          // But...
          std::array<int, foo(i)> arr1; // Error 除非 i 用constexpr 声明
      }
      
      

      简单的来说,如果其传入的参数是编译期常量,那么这个函数就会产生编译时期的值。但是,传入的参数如果不是编译期常量,那么constexpr修饰的函数就和普通函数一样了。

  • constexpr函数即可以在编译期间运行,也可以在运行时运行,这样做是为了避免产生同一个函数需要写编译期和运行期两个重复版本的麻烦。
  • C++11 标准规定,如果 constexpr 修饰的模板函数实例化结果不满足常量表达式函数的要求,则 constexpr 会被自动忽略
  • 在使用constexpr声明一个类型为T的变量时,constexpr会自动把这个变量定义为const T类型。即constexpr在完成它本职工作(告诉编译器这是个编译期常量)的同时,还把原来的T类型改为了const T类型。

三、consteval

  • consteval 则可以看作是更加严格的constexpr,它只能用于函数的声明,所有对它的调用都必须在编译期完成,而不能在运行期,因此可以保证在生成的代码中不包含任何对consteval函数的调用。

四、constinit

  • constinit 的作用在于显式地指定变量的初始化方式为静态初始化。所有使用constinit声明的变量,其生命周期必须为静态生命周期或线程本地(Thread-local)生命周期(即不能为局部变量),其初始化表达式必须是一个常量表达式。

————————————————

摘录自


总结

时代在进步,特性在增加, 名字会有遗留问题

深入理解C++ const:从语法到高级应用与性能优化 在C++编程中,类型系统是确保代码安全性和表达力的核心机制之一。const作为类型限定符,其核心原理是为变量、函数参数、成员函数等提供“不可修改”的保证,从而在编译期捕获潜在的错误,增强代码的健壮性。这一特性在现代软件开发中具有重要价值,它不仅是实现常量正确性的基础,还能辅助编译器进行优化,并广泛应用于API设计、资源管理和并发编程等场景。特别是在函数参数传递中,使用const引用能有效避免不必要的拷贝,提升性能。本文聚焦于C++ const关键字的深度解析,系统梳理了顶层const与底层const的区别、 阅读详情

相关推荐

深入解析C++ const与constexpr:从编译期优化到运行时安全

本文深入解析C++中const与constexpr的核心区别与应用场景,重点探讨constexpr在编译期优化、数学计算、元编程等方面的实战技巧。通过性能对比和典型示例,展示如何利用constexpr提升运行时效率,并给出常见陷阱的解决方案,帮助开发者更好地运用这两个关键字进行代码优化。

weixin_29005499的博客 551

C++20:constexpr、consteval和constinit

C++从C++11开始支持constexpr,直到C++20对constexpr的完整支持,constexpr标准化跨越了13年,由4个标准实现。C++20也是最接近最初语言设计模板的版本,但是constexpr的设计其实也不够严谨,所以 C++20 引入了 consteval;由于constexpr仅能实现编译时常量求值,为了解决编译时非常量求值问题,C++20又引入了constinit关键字。本文详细介绍constexpr/constinit/consteval支持历史和版本。

一鸣惊人的博客 3718

从const到constexpr:C++常量进化史与现代最佳实践

本文深入探讨了C++中从`const`到`constexpr`的常量进化历程,解析了`constexpr`在编译时计算、模板友好性和类型检查等方面的优势。通过对比分析不同C++标准下的特性演进,提供了现代项目中的最佳实践指南,帮助开发者高效利用常量表达式优化代码性能。

weixin_29002595的博客 522

C++20新特性—consteval与constinit

consteval可用在立即函数(immediate function),立即函数实际上是编译时运行的函数,也就是它的参数在编译时是“确定的”(常量),它的结果也是常量。constexpr可用于编译或运行时函数,它的结果是常量。它们区别如下例,特别注意的是注释掉的那行。 using namespace std; consteval int compileconst(int n) { return n+1;} constexpr int runcompileconst(int n) { return n

guxch的专栏 4954

C++ constexpr递归演进:从C++11到C++20的编译期计算实战

编译期计算是现代C++实现零成本抽象的核心技术之一,它允许在程序运行前完成计算,从而消除运行时开销并提前捕获错误。其原理是通过constexpr关键字标记函数或变量,使编译器能够在编译阶段执行求值。这项技术的价值在于提升程序性能、增强类型安全与确定性,广泛应用于数学常数计算、数据结构验证、配置解析等场景。随着C++标准的演进,constexpr能力不断扩展,从C++11的基础递归支持到C++20的动态内存分配,使得编译期编程更加灵活强大。本文聚焦constexpr递归的演化路径,结合json递归详解等实际案

weixin_34049948的博客 531

C++之常量体系const

介绍了C++中的四种常量关键字:const、constexpr、consteval和constinit。const提供只读契约但不保证物理不可变;constexpr强制编译期求值,支持元编程;consteval限定函数必须编译期执行;constinit确保静态初始化安全,解决SIOF问题。

飞鹰技术 305

【C++】用constexpr,constinit,consteval让程序跑的快一点

从几个例子其实也可一看出来,这三个关键字的作用,都是为了让可以确定的运算结果,在编译时就首页被执行完毕,这样,运行时等于只是操作一个具体的常量,不会在执行多余的运算,也就提高了一点运行速度。也就是说,被这三个关键字修饰的变量或者函数,即使不使用编译器、程序不运行,也能准确的知道他最终的值.这时候才能使用上述三个关键字功能。

. 710

C++常量全解析

本文全面解析C++常量体系,涵盖const、constexpr、consteval、constinit等关键概念。从基础的字面量、指针/引用const用法,到类成员函数const修饰、mutable特殊场景,再到编译期常量constexpr/consteval的区别与适用场景,以及头文件常量的工程实践。文章重点讲解了顶层/底层const、const正确性、ODR规则等核心知识点,并提供了面试高频问题和工程最佳实践清单。通过系统梳理C++常量机制,帮助开发者编写更安全、高效、符合现代C++规范的代码。

2401_88186301的博客 592

C++ 20新特性之constexpr与consteval

C++ 20在编译时计算和模板元编程方面引入了一些比较重要的改进,其中,constexpr和consteval关键字是两个核心特性,大大增强了C++在编译时执行代码的能力。这两个关键字与C++的泛型编程、模板元编程紧密相关,能够帮助开发者编写出既高效又灵活的代码。

hope_wisdom的技术博客 1505

HDMI设计6--Video PHY Controller IP

Reference:https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/vid_phy_controller/v2_2/pg230-vid-phy-controller.pdf 1. 序 Video PHY Controller IP是为实现与视频(DisplayPort和HDMI™技术)MAC传输或接收子系统的即插即用连接而设计的。视频MAC层和PHY层的接口是标准化的,能...

Archar_Saber的博客 8338

设计空间探索:乘法器设计的面积、延时、功耗优化

4-2压缩器在减少延迟方面表现出色,适用于需要快速压缩的场景。6-2压缩器在资源占用方面具有优势,能够减少压缩树的层次数量和逻辑门数量。优化功耗:通过合理组合不同类型的压缩器,可以在延迟、资源占用和功耗之间找到最佳平衡点,从而实现优化的设计目标。###参考资料。

SiArch的博客 1876

【翻译】【C++基础知识】C++20 中的 const、constexpr、consteval 与 constinit

关键字能否修饰自动变量(局部变量)能否修饰静态/线程局部变量能否修饰函数是否支持用于常量表达式const是是仅能修饰 const 成员函数有时(如 const 整型常量)constexpr是(或在 constexpr 函数中隐式修饰)是是(修饰 constexpr 函数)是consteval否否是(修饰 consteval 函数)是(作为函数调用的结果)constinit否是(强制常量初始化)否否(constinit 变量不是 constexpr 变量)

沐怡旸的专栏 281

别再只用相机标定了!手把手教你用OpenCV和Python搞定投影仪标定(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现投影仪标定,特别针对结构光三维扫描中的核心问题。通过低成本替代方案和优化算法,解决投影仪标定中的非线性畸变和亮度-距离耦合效应,显著提升三维重建精度。附完整代码和实战技巧,帮助开发者快速掌握关键技术。

weixin_29274337的博客 541

C++常量全解析:const/constexpr/consteval一篇讲透

本文全面解析C++中的常量体系,包括const、constexpr、consteval和constinit四种关键修饰符。首先介绍const的基础用法和指针/引用场景,重点区分顶层const和底层const的概念。然后深入讲解constexpr编译期常量、consteval强制编译期求值、constinit安全初始化等现代C++特性。文章还涵盖类成员常量、头文件常量定义规范、const正确性等工程实践要点,并指出常见陷阱如ODR问题和const_cast风险。最后提供面试高频问题和最佳实践清单,帮助开发者掌

2401_88186301的博客 1055

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 339

从零到一:TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南

本文详细介绍了TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南,涵盖硬件连接、软件配置、固件烧录、雷达参数设置及数据处理等关键步骤。通过MATLAB等工具,开发者可高效实现毫米波雷达数据采集,适用于自动驾驶、工业检测等领域。

weixin_29001327的博客 966

C++11 扩展 - 深入理解 C++ 中的 const 与 constexpr

本文深入解析C++中const和constexpr关键字的核心用法与演进。const分为顶层(指针本身不可改)和底层(指向对象不可改)两种修饰方式。constexpr则用于编译期计算,可修饰变量、函数和类,要求初始化值为常量表达式。文章详细介绍了constexpr函数的限制条件(C++11仅单return语句,C++14放宽至支持局部变量和控制流),以及在类构造函数、成员函数和模板中的应用。同时梳理了C++17引入的if constexpr和constexpr lambda,以及C++20对动态内存分配、标

Small_entreprene的博客 1628

Vivado Schematic视图实战:从RTL分析到布局布线,如何用它快速定位设计问题(附2019.1版操作)

本文深入解析Vivado Schematic视图在FPGA设计中的关键作用,从RTL分析到布局布线全流程,帮助工程师快速定位设计问题。通过三重视图对比、高效调试四步法和高级技巧,提升问题排查效率,缩短调试时间。文章结合2019.1版操作指南和实战案例,展示如何利用Schematic视图解决典型设计问题。

weixin_30591551的博客 488

C++——2.常量与 const、constexpr 初识详解

本文深入探讨了C++中const和constexpr两种常量定义方式的本质区别与应用场景。const提供"只读承诺",可在编译期或运行期确定值,适用于普通常量声明;而constexpr强制要求编译期确定值,支持编译期计算,适用于需要严格常量表达式的场景。文章详细解析了两者的语法特性、使用限制和最佳实践,并通过代码示例展示了constexpr函数、编译期计算、lambda表达式以及if constexpr等高级用法。最后通过对比表格清晰呈现了两者在语义、初始化时机、适用场景等核心维度的差异,帮助开发者根据具体

weixin_45724919的博客 634

《数据结构》知识点汇总+算法代码总结【全】

写在前面:本文写于吴签时期,在家备考时刷完数据结构王道书之后想着把书中重点梳理汇总一下。本文内容包括但不局限于王道数据结构每章的知识点及其课后习题所涵盖的知识点。本人曾在大三期间打过一些程序设计类比赛,所以本文所涉及到的代码不一定局限于王道书,但思想都一样。 期末复习和备考408均可使用第一章:绪论(不在考研大纲但很重要)第二章:线性表第三章:栈和队列第四章:串第五章:树与二叉树第六章:图第七章:查找 第一章:绪论(不在考研大纲但很重要) 数据结构三要素:逻辑结构、存储结构、数据的运算;其中逻辑结构包括线

qq_44622401的博客 17万+

厉害了,华为推出下一代光传送网:fgOTN

2024年10月,在全球信息技术博览会(GITEX Global 2024)上,华为正式发布了其颠覆性的创新产品——端到端细粒度光传送网(fgOTN)解决方案。这一产品组合被誉为行业内首个fgOTN,旨在重塑光传送网络的格局,满足电力运输等行业日益增长的通信需求。在过去的近三十年中,同步数字体系(SDH)技术一直是电信和工业网络的支柱,因其可靠性、稳定性和低延迟而备受青睐。然而,随着数据需求的激增,SDH的最大带宽仅为10 Gbps,逐渐显露出局限性。

网络技术联盟站 635

Day5-constexpr 与编译期计算

/ ❌ 危险:除零是未定义行为,constexpr 中不允许// 如果 b == 0,整个调用都是 UB// ✅ 正确:手动检查return b!= 0?a / b : 0;// 避免 UB优先 consteval:如果函数一定能编译期求值,用consteval强制它用 static_assert 验证:对关键编译期计算添加静态断言避免运行时类型信息:constexpr 中不能使用typeid等运行时特性考虑 C++20 std::is_constant_evaluated()

如风逝去 269

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++---关键字constexpr 在编译期计算常量或表达式

C++11 起引入的 constexpr 关键字逐步成为编译期计算的核心技术,它允许变量、函数和对象在编译期求值,兼具性能优化和类型安全。constexpr 变量必须编译期初始化,支持基本类型、数组和自定义类。constexpr 函数根据参数决定编译期或运行期执行,标准演进中逐步放宽循环、条件等限制。C++17/20 新增 constexpr lambda、consteval(强制编译期执行)和 constinit(编译期初始化)特性,使编译期计算能力更完善。该技术通过消除运行时开销、强化类型检查,实现了零

MzKyle的博客 1290

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++那些事之const全家桶

C++那些事之const全家桶大纲constconstexprC++20constevalconstinit注:本文所有代码示例已放星球。1.constconst 是我们在学习 C++/C 时最早接触的关键字之一,通常作为 cv-qualifier 使用,表示对象不可变。它并不保证 编译时评估,具体何时评估由编译器决定。例如:constinta=1;//编译时 constautox...

Francis的博客 766

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CppCon 2025 学习:Back to Basics: static, inline, const, and constexpr

#23450;义阴影效果定义箭头标记翻译单元虚线框现文件件多头文件more。

虾球 784

跟我学C++中级篇——对类const关键字的分析说明

本文对比分析了C++中四个相似关键字const、constexpr、consteval和constinit的区别与应用场景。const用于运行时只读控制,constexpr支持编译期计算,consteval强制编译期求值函数,constinit确保静态变量的编译期初始化。文章通过示例代码展示了各关键字的具体用法,并指出应根据实际需求选择合适的关键字,同时考虑C++标准版本差异,以编写安全高效的代码。重点在于理解各关键字在编译期与运行期行为上的差异,以及它们在接口约束、编译期计算和初始化控制等场景下的适用性。

fpcc的专栏 781
上一篇: C++11-C++17新特性介绍
下一篇: windows+GTK4_3+Clion+msys2
Computer_Tech
博客等级 码龄3年 573粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值