(C++20) constinit常量初始化

文章目录

  • 由来
  • constinit 常量初始化
    • 常量初始化 != 初始化常量
    • 初始化声明静态存储对象
    • 非初始化声明thread_local
  • END

由来

在C++多文件编译中会出现一个常见的问题,叫做静态初始化顺序问题。Static Initialization Order Fiasco

比如现在有两个文件,其中都有一个全局变量。

// file1.cpp
int x = 10;// file2.cpp
int y = 20;

由于多文件编译顺序等一些列问题,可能又有第三个或者更多对象对这两个有了依赖,就会出现一些列意想不到的问题。

通常解决方案是使用函数内部的局部静态变量Locia Static,来解决该问题,因为C++保证了局部静态变量只有在第一次调用到的时候才初始化,这也是著名设计模式,单例模式中最常用的一个技巧。

而要正面应对这个问题就需要C++20中的constinit

constinit 常量初始化

constinit 说明符 (C++20 起) - cppreference.com

常量初始化 != 初始化常量

请务必理解下面的区别

// 这是`初始化一个常量`
constexpr int x = 10;// 这是`常量初始化`
constinit int y = 20;int main() {// 不能修改一个常量// error: assignment of read-only variable 'x'// x = 100;// oky = 200;
}

就是说常量初始化是在编译期间确定初始值。而对象本身的读写性质不受影响。

初始化声明静态存储对象

constinit 可以针对具有静态存储方式的对象的声明上。

// 全局函数
constinit int x = 10;int main() {// 局部静态函数constinit static int y = 20;
}

非初始化声明thread_local

下面是cpppref原话和code

constinit 也能用于非初始化声明,以告知编译器 thread_local 变量已被初始化,以减少隐藏的防卫变量所致的开销。

extern thread_local constinit int x;
int f() { return x; } // 无需检查防卫变量



END

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

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

相关文章

[C++] new和delete

使用new时调用构造函数使用delete时调用析构函数 构造函数 使用new动态分配内存时,如果分配的是基本类型的内存,则不会调用构造函数。如果分配的是自定义类型的内存,则会调用构造函数进行对象的初始化。 例如: int* pInt new…

谁登榜? 2023数据安全平台神兽企业

在数字经济的浪潮中,数据安全已成为企业发展的关键支撑。2023年8月,CSA大中华区启动数据安全平台神兽企业调研,得到了众多网络安全综合厂商、数据安全专业厂商、云服务提供商、用户单位的广泛关注和积极参与。 历时4个月,CSA大中…

Java 线程池到底是如何复用线程的

原理概述 其实 Java 线程池的实现原理很简单,说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时,线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…

macos安装metal 加速版 pytorch

categories: [Python] tags: Python MacOS 写在前面 试试 m3 的 metal 加速效果如何 Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 Python: conda-forge brew install minif…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ public static ServerSocket server_socket; public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []ar…

GO设计模式——1、简单工厂模式(创建型)

目录 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 简单工厂模式的核心角色 优缺点 代码实现 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 简单工厂模式又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中&#xff0c;可以…

性能调优入门

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能定律和数理基础 1.三个定律法则 (1)帕累托法则 我它也被称为 80/20 法则、关键少数法则&#xff0c;或者八二法则。人们在生活中发现很多…

Ubuntur编译ROS报错:error PCL requires C++14 or above

ubuntu20.04 编译ROS包 报错&#xff1a; error&#xff1a; PCL requires C14 or above&#xff1a; 修改Cmakelists.txt文件&#xff1a; set&#xff08;CMAKE_CXX_STANDARD 14&#xff09; 再次编译成功.

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

Linux: sudo: unable to execute /opt/sbin/adm: No such file or directory

sudo: unable to execute /opt/sbin/adm: No such file or directory 这个错误有可能的原因是,sudo的设置里权限配置不对。 比如其他用户不应该有可执行权限,但是这个命令有,就不让执行。 但是这个错误提示有点让人迷惑,可能也是故意的。 另一个原因是:https://mzhan017…

HashMap和Hashtable的区别

一、简介 HashMap: 1、HashMap是非线程安全的&#xff0c;只是用于单线程环境下&#xff0c;多线程环境下可以采用concurrent并发包下的concurrentHashMap。 2、HashMap 实现了Serializable接口&#xff0c;因此它支持序列化&#xff0c;实现了Cloneable接口&#xff0c;能被…

改造python3中的http.server为简单的文件上传下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …

UDP协议实现群聊

服务端 package ydd;import java.io.*; import java.net.*; import java.util.ArrayList; public class A2{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []a…

【C++】如何优雅地把二维数组初始化为0

2023年12月7日&#xff0c;周四上午 目录 为什么要初始化二维数组不优雅的初始化方式&#xff1a;使用两个for循环优雅的初始化方式一&#xff1a;使用初始化列表优雅的初始化方式二&#xff1a;使用memset函数 为什么要初始化二维数组 如果不初始化二维数组&#xff0c;那么…

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…

【Python】流畅!一个非常好用的网络数据采集工具!

文章目录 前言一、注册二、初窥三 数据集四 自定义网站网络爬虫总结 前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

数据结构——堆(存储完全二叉树)

目录 一、堆的概念 二、堆的一些性质 三、堆的结构定义 四、堆的初始化 五、堆打印 六、向上调整算法 七、堆的插入 八、向下调整算法 九、堆的删除 十、取堆顶元素 十一、求堆大小 十二、堆判空 十三、测试代码 一、堆的概念 堆是一种顺序存储完全二叉树的数据结…

智能井盖传感器产品介绍,井盖传感器推荐

智能井盖传感器是一种先进的设备&#xff0c;能够提高城市管理的智能化水平。该传感器作为城市生命线建设的核心组成部分&#xff0c;为智慧城市的正常建设提供了有力的保障&#xff0c;能够提高城市管理的智能化水平。这种设备通过高度灵敏的传感器网络&#xff0c;实时监测井…

智能优化算法应用:基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…