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

} // namespace

int 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

捷配笔记-PCB阻焊颜色对产品有什么影响?

阻焊层也称为阻焊层或阻焊剂。它是一种薄的聚合物层&#xff0c;应用于&#xff08;PCB&#xff09;。阻焊层的目的是保护PCB表面&#xff0c;并有助于防止焊桥。焊桥是两个导体之间的无意连接&#xff0c;通常是由于存在一小块焊料。需要注意的是&#xff0c;阻焊层被视为其单…

书生大模型实战营--L0关卡-Linux

一、SSH登录并完成nvidia-smi查看显卡以及安装pip install gradio4.29.0 二、完成vscode连接远程服务器 三、运行http://127.0.0.1:7860/

HTML表格表单及框架标签

一.表格标签 1.<table></table> 创建表格 2.<caption></caption> 表格的标题 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格数据&#xff09;其中有属性rowspan"2&quo…

单点触摸屏和多点触摸屏介绍以及原理简略

单点和多点触摸屏技术是现代触摸设备的基础&#xff0c;下述简单解释这两种技术及其差异。 单点触摸屏 单点触摸屏只能在某一时刻检测一个触摸点的位置。这种触摸屏适用于简单的触摸交互&#xff0c;如点击和拖动。 工作原理 单点触摸屏主要通过以下几种技术实现&#xff1…

SQL server 练习题2

课后作业 作业 1&#xff1a;自己查找方法&#xff0c;将 homework_1.xls 文件数据导入到 SQLServer 的 homework 数据库中。数据导入完成后&#xff0c;把表名统一改为&#xff1a;外卖表 如下所示&#xff1a; 作业 2&#xff1a;找出所有在 2020 年 5 月 1 日至 5 月 31 …

【Redis从0到1进阶】Redis 持久化

笔记内容来自B站博主《遇见狂神说》&#xff1a;Redis视频链接 Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出&#xff0c;服务器中的数据库状态也会消失。所有Redis 提供了持久化功能&#xff01; 一、RDB&#xff…

【256 Days】我的创作纪念日

目录 &#x1f33c;01 机缘 &#x1f33c;02 收获 &#x1f33c;03 日常 &#x1f33c;04 成就 &#x1f33c;05 憧憬 最近收到官方来信&#xff0c; 突然发现&#xff0c;不知不觉间&#xff0c;距离发布的第一篇博客已过256天&#xff0c;这期间我经历了春秋招、毕业答辩…

AV1 编码标准熵编码技术概述

AV1熵编码 AV1编码技术是一种开源的视频编解码标准&#xff0c;由开放媒体联盟&#xff08;AOMedia&#xff09;开发&#xff0c;旨在提供高效的视频压缩&#xff0c;同时避免复杂的专利授权问题。在熵编码方面&#xff0c;AV1采用了一种多符号上下文自适应算术编码技术&#x…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

数据库:基本操作

SQL struct query language 关系型数据库 非关系 芒果db ddl data defination language 建表 dml 新增 修改 删除一行 data modifty dql 查询 data query language 查询 select 数据库 sun solaris gnu 1、分类&#xff1a; 大型 中型 …

MySQL学习记录 —— 이십 常用工具包

文章目录 1、总览2、mysqlcheck - 表维护程序1、作用2、注意事项3、语法4、命令选项下面每块都大致有这四个部分 3、Mysqldump - 数据库备份程序4、mysqladmin - MySQL 服务器管理程序5、mysqlshow - 显示数据库、表和列信息6、mysqldumpslow - 总结慢查询日志文件7、mysqlbinl…

内存ECC基础纠错算法有哪些?

3.1 基础纠错算法 3.1.1 SECDED纠错算法 SECDED&#xff08;Single Error Correction Double Error Detection&#xff09;是一种经典的ECC方案&#xff0c;能够纠正单比特错误并检测出双比特错误。在图4(a)中&#xff0c;展示了SECDED的编码过程。在这个过程中&#xff0c;使…

STM32之八:IIC通信协议

目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 发送一个字节 2.3 接收一个字节 2.4 应答信号 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总线。该通信模式需要2根线&#xff1a;SCL、…

mysql(5.5)启动服务和环境配置

正常启动 参考&#xff1a;Javaweb基础之mysql回溯笔记(一) 总的来说就是在mysql的安装目录下&#xff0c;找到bin下面的msyqld.exe&#xff0c;双击即启动了mysql服务&#xff1b; 启动方式二 也可以直接找到windows的服务项进行启动&#xff0c;操作如下&#xff1a; 打开…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

MySQL集群、Redis集群、RabbitMQ集群

一、MySQL集群 1、集群原理 MySQL-MMM 是 Master-Master Replication Manager for MySQL&#xff08;mysql 主主复制管理器&#xff09;的简称。脚本&#xff09;。MMM 基于 MySQL Replication 做的扩展架构&#xff0c;主要用来监控 mysql 主主复制并做失败转移。其原理是将真…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …

多模态大模型 - MM1

1. 摘要 本文主要通过分析模型结构和数据选择讨论如何构建一个好的多模态大模型&#xff08;MLLM&#xff09;&#xff0c;并同时提出了MM1模型&#xff0c;包括30B dense版本和64B的MoE版本。 具体贡献&#xff1a; 模型层面&#xff1a;影响效果的重要性排序为&#xff1a;…

昇思25天学习打卡营第10天|NLP-RNN实现情感分类

打卡 目录 打卡 任务说明 流程 数据准备与加载 加载预训练词向量&#xff08;分词&#xff09; 数据集预处理 模型构建 Embedding RNN(循环神经网络) LSTM 全连接层 损失函数与优化器 训练逻辑 评估指标和逻辑 模型训练与保存 模型加载与测试 自定义输入测试 …