当前位置: 首页 > 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

相关文章:

C++20中的constinit说明符

constinit说明符断言(assert)变量具有静态初始化&#xff0c;即零初始化和常量初始化(zero initialization and constant initialization)&#xff0c;否则程序格式不正确(program is ill-formed)。 constinit说明符声明具有静态或线程存储持续时间(thread storage duration)的…...

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分&#xff0c;具有特殊意义&#xff0c;前面加一个反斜可以取消其特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个…...

华为配置蓝牙终端定位实验

个人主页&#xff1a;知孤云出岫 目录 配置蓝牙终端定位示例 业务需求 组网需求 数据规划 配置思路 配置注意事项 操作步骤 配置文件 配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业…...

搭建hadoop+spark完全分布式集群环境

目录 一、集群规划 二、更改主机名 三、建立主机名和ip的映射 四、关闭防火墙(master,slave1,slave2) 五、配置ssh免密码登录 六、安装JDK 七、hadoop之hdfs安装与配置 1)解压Hadoop 2)修改hadoop-env.sh 3)修改 core-site.xml 4)修改hdfs-site.xml 5) 修改s…...

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…...

jvm优化

1.jvm组成 什么是jvm&#xff0c;java是跨平台语言&#xff0c;对不同的平台&#xff08;windos&#xff0c;linux&#xff09;&#xff0c;有不同的jvm版本。jvm屏蔽了平台的不同&#xff0c;提供了统一的运行环境&#xff0c;让java代码无需考虑平台的差异。 jdk包含jre包含…...

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…...

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…...

[k8s源码]2.CURD deployment

加载kubernetes配置 使用 clientcmd方法&#xff0c;是通过"k8s.io/client-go/tools/clientcmd"包加载的。这个函数返回的是config和error两个值。可以看到返回的config是一个指针变量。 func clientcmd.BuildConfigFromFlags(masterUrl string, kubeconfigPath str…...

使用base64通用文件上传

编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容&#xff0c;读取完成后获得文件名和base64码&#xff0c;调用后端uploadApi,传入姓名和base64文件信息&#xff0c;后端存入nginx中&#xff0c;用于访问 tuku.ts组件代码&#xff1a; <templa…...

Python深度学习

python深度学习&#xff0c;python代码定制&#xff0c; 可做创新点 创新思路 代码改进跑通 深度学习 Python代跑时间序列预测 分析 代码编写 python编程 深度学习算法 自然语言处理 神经网络跑通指导 爬虫调试代做 项目指导 定制帮做 改进 提升 创新 优化 Python Matlab C…...

django报错(三):No crontab program或got an unexpected keyword argument ‘user’

Crontab是linux系统上的定时管理模块&#xff0c;简单配置&#xff0c;灵活使用。但是要在windows使用必须借助Cygwin等虚拟工具&#xff0c;否则会报错“No crontab program”。如下图&#xff1a; python-crontab是其提供了python模块对crontab的访问&#xff0c;即可以通过p…...

数据库(创建数据库和表)

目录 一&#xff1a;创建数据库 二&#xff1a;创建表 2.1&#xff1a;创建employees表 2.2&#xff1a;创建orders表 2.3&#xff1a;创建invoices表 一&#xff1a;创建数据库 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec) mysql&g…...

Log4j的原理及应用详解(一)

本系列文章简介&#xff1a; 在软件开发的广阔领域中&#xff0c;日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程&#xff0c;还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂&#xff0c;对日志管理的需求也日…...

ubuntu系统Docker常用命令

1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…...

韦东山嵌入式linux系列-驱动设计的思想(面向对象/分层/分离)

1 面向对象 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2 分层 上下分层&#xff0c;比如我们前面写的 LED 驱动程序就分为 2 层&#xff1a; ① 上层实现硬件无关的操作&#xff0c;比如注册…...

0/1背包

0/1背包 背包问题是DP最经典的类型之一&#xff0c;而0/1背包是最经典最基础的背包问题。 背包体积为 V V V&#xff0c; n n n种物品&#xff0c;每种物品只有1个&#xff0c;第 i i i种物品对应体积为 c i c_i ci​&#xff0c;价值为 w i w_i wi​&#xff0c;怎样装填能使…...

Linux的进程和权限的基本命令

目录 基本命令 man find date cal du ln exit grep 基本命令-帮助查询&#xff1a; wc cat more less head tail echo alias unalias 基本命令-进程管理&#xff1a; ps kill top 操作系统负载查看 用户分类&#xff1a; 程序用户 普通用户&#x…...

鼠标录制工具怎么挑选?9款电脑鼠标录制工具分享(2024)

你知道鼠标录制工具吗&#xff1f;鼠标录制工具通过记录和回放用户的操作&#xff0c;帮助自动化重复性任务&#xff0c;提高工作效率和精确性。它可以帮助用户简化很多繁琐的操作步骤&#xff0c;非常适合运用在电脑自动化任务、游戏自动化中&#xff0c;给大家整理了2024年9款…...

C1W4.LAB.Vector manipulation+Hash functions and multiplanes

理论课&#xff1a;C1W4.Machine Translation and Document Search 文章目录 Python 中的矢量操作Transforming vectorsExample 1Example 2 Frobenius Norm Hash functions and multiplanesBasic Hash tablesPlanesHash Function with multiple planesRandom PlanesDocument v…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...