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

C++20中的constinit说明符

      constinit说明符断言(assert)变量具有静态初始化,即零初始化和常量初始化(zero initialization and constant initialization),否则程序格式不正确(program is ill-formed)。

      constinit说明符声明具有静态或线程存储持续时间(thread storage duration)的变量。如果使用constinit声明变量,则必须使用constinit应用其初始化声明。如果使用constinit声明的变量具有动态初始化(即使以静态初始化执行),则程序格式不正确。

      constinit不能与constexpr一起使用。当声明的变量是引用时,constinit等同于constexpr。当声明的变量是对象时,constexpr要求该对象必须具有静态初始化和常量析构,并使该对象带有const限定的(const-qualified),但是,constexpr不要求常量析构和带有const限定。因此,具有constexpr构造函数但没有constexpr析构函数的类型的对象可能用constinit声明,但不用constexpr声明。

      constinit还可以用于非初始化声明中,以告知编译器thread_local变量已初始化,从而减少隐藏保护变量可能产生的开销。thread_local变量对于每个线程都有一个单独的实例,并且它们的值在线程的整个生命周期内保留。

      constinit允许变量在编译时或动态初始化时初始化,但不能在运行时初始化。它确保变量只初始化一次,并且初始化后其值不能更改。

      constinit用于声明静态和thread_local变量,这些变量保证使用常量表达式进行初始化。

      具有静态存储持续时间(static storage duration)的变量在程序启动时初始化一次,并在程序的整个生命周期内保留其值。

      constinit用于指示变量应在编译时初始化。该变量必须声明为constexpr,并且只能使用常量表达式初始化,使其成为编译时常量。

      constinit解决了初始化顺序问题(确保以受控方式初始化变量,从而减少由于未初始化和部分初始化的变量而导致意外行为的可能性),提高了静态对象初始化的稳健性。

      constinit可防止在运行时初始化具有静态存储持续时间的变量。使用constinit说明符指定的变量需要使用常量表达式进行初始化。

      constinit不能与constexpr或consteval一起使用,因为constinit用于变量的静态初始化,这发生在程序开始执行之前,而constexpr和consteval用于在编译时评估表达式。

      初始化具有静态存储持续时间的变量可能会导致两种结果:变量在编译时初始化(常量初始化);变量在控制第一次通过其声明时初始化。

      constinit只能应用于具有静态存储持续时间的变量。如果修饰变量在编译时未初始化,则程序格式不正确(即无法编译)。使用constinit可确保变量在编译时初始化,并且不会发生静态初始化顺序混乱。

      constexpr确实意味着constinit。反之则不是

      变量可以同时是const和constinit。它不能同时是constexpr和constinit。

      constinit只能应用于具有静态或线程存储持续时间的变量。将它应用于其他变量是没有意义的,因为constinit都是关于静态初始化的。

      以下为测试代码:

namespace {
template <typename T>
class LuckyNum {
public:inline static constinit int num{ 66 };//inline static int num{ 66 }; // ok//inline static constexpr int num{ 66 }; // ok
};consteval int factorial(int n) {
//constinit consteval int factorial(int n) { // error C2216: "constinit"不能和"consteval"一起使用return n == 0 ? 1 : n * factorial(n - 1);
}constinit int arr1[] = { 1, 2, 3, factorial(4) };
constexpr int arr2[] = { 1, 2, 3, factorial(4) };
//constinit constexpr int arr3[] = { 1, 2, 3, factorial(4) }; // error C2216: "constinit"不能和"constexpr"一起使用
const constinit int arr4[] = { 1, 2, 3, factorial(4) };const char* gg() { return "dynamic initialization"; }
constexpr const char* ff(bool p) { return p ? "constant initializer" : gg(); }constinit const char* c = ff(true); // OK
//constinit const char* d = ff(false); // ERROR: 'gg' is not constexpr, so 'd' cannot be evaluated at compile-time} // namespaceint test_constinit()
{LuckyNum<int> num1;LuckyNum<std::string> num2;std::cout << "num1 value: " << num1.num << std::endl;std::cout << "num2 value: " << num2.num << std::endl;std::cout << "arr1[3]: " << arr1[3] << std::endl;std::cout << "arr2[3]: " << arr2[3] << std::endl;return 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据结构】二叉树———Lesson2
  • 十七、【文本编辑器(三)】图像坐标变换
  • 低代码中间件学习体验分享:业务系统的创新引擎
  • 从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
  • 云监控(华为) | 实训学习day2(10)
  • Eclipse 内容辅助
  • 微信小程序学习之旅
  • 【iOS】—— 消息传递和消息转发
  • 团队高效地使用 Git 进行协同开发
  • 【常见开源库的二次开发】基于openssl的加密与解密——MD5算法源码解析(六)
  • Axure中继器进阶指南:打造专业级交互
  • <数据集>UA-DETRAC车辆识别数据集<目标检测>
  • 【已解决】Django连接MySQL启动报错Did you install mysqlclient?
  • 基于STM32设计的人体健康监测系统(华为云IOT)(189)
  • 前端学习(二)之HTML
  • 【剑指offer】让抽象问题具体化
  • axios 和 cookie 的那些事
  • es6
  • JAVA_NIO系列——Channel和Buffer详解
  • java第三方包学习之lombok
  • js如何打印object对象
  • Laravel Telescope:优雅的应用调试工具
  • Meteor的表单提交:Form
  • Rancher如何对接Ceph-RBD块存储
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 服务器从安装到部署全过程(二)
  • 计算机常识 - 收藏集 - 掘金
  • 跨域
  • 使用 QuickBI 搭建酷炫可视化分析
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 突破自己的技术思维
  • 微信小程序实战练习(仿五洲到家微信版)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • Mac 上flink的安装与启动
  • UI设计初学者应该如何入门?
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​一些不规范的GTID使用场景
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #DBA杂记1
  • #大学#套接字
  • #控制台大学课堂点名问题_课堂随机点名
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Java入门)抽象类,接口,内部类
  • (libusb) usb口自动刷新
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (zhuan) 一些RL的文献(及笔记)
  • (编译到47%失败)to be deleted
  • (二)PySpark3:SparkSQL编程
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (算法)区间调度问题
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)